linq - 如何将字符串变量传递给 linq select new {} 部分

标签 linq linq-to-sql asp.net-3.5

我只想使用存储到 session 变量的多个 ColumnNames 的 linq 来实现搜索功能。我正在使用一种方法:

public void FillGrid(string CommandName,string ColumnName, string SearchText)

它有三个存储 session 值的字符串变量。

现在我只想通过此查询传递 ColumnName:

var query1 = (from p in db.Posts
              join c in db.Categories on p.Category_id equals c.Id
              join u in db.Users on p.User_id equals u.Id
              where (p.ToUser_id == user_id || p.ToUser_id == null) && p.User_id != user_id
              orderby p.Sent_Datetime descending
              select new
              {
                  Id = p.Id,
                  Title = p.Title,
                  Publisher = u.First_name + " " + u.Last_name,
                  ToUser = p.ToUser_id,
                  PublishDate = p.Sent_Datetime,
                  IsFile = p.IsFileAttached,
                  CategoryName = c.Category_name,
                  status_name = (from s in db.Status where (s.Id == p.status_id) select s.status_name).FirstOrDefault(),
                  Group_name = (from g in db.Groups where (g.Id == p.group_id) select g.Group_name).FirstOrDefault(),
                  FileSize = p.TotalFileSize,
                  ColumnName = Sesssion["ColumnName"].ToString()
              }).Where(q => q.ColumnName.Contains(SearchText));

但是,ColumnName 没有给出任何文本,或者它可能不是此查询的一部分,因为我必须手动给出列名称。

对于我有多列,所以我不能使用这样的语句:

.Where(q => q.Tile.Contains(SearchText));

此查询适用于单列。但我有多个列,所以我必须从外侧设置 q.ColumnName。

最佳答案

我会为这类事情做一个扩展方法,为你的谓词构建一个表达式。

 public static class Helper
{
    public static IQueryable<T> FilterForColumn<T>(this IQueryable<T> queryable, string colName, string searchText)
    {
        if (colName != null && searchText != null)
        {
            var parameter = Expression.Parameter(typeof(T), "m");
            var propertyExpression = Expression.Property(parameter, colName);
            var searchExpression = Expression.Constant(searchText);
            var containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) });
            var body = Expression.Call(propertyExpression, containsMethod, searchExpression);
            var predicate = Expression.Lambda<Func<T, bool>>(body, new[] { parameter });
            return queryable.Where(predicate);
        }
        else
        {
            return queryable;
        }
    }
}

在您的案例中的用法

var query1 = (from p in db.Posts
              join c in db.Categories on p.Category_id equals c.Id
              join u in db.Users on p.User_id equals u.Id
              where (p.ToUser_id == user_id || p.ToUser_id == null) && p.User_id != user_id
              orderby p.Sent_Datetime descending
              select new
              {
                  Id = p.Id,
                  Title = p.Title,
                  Publisher = u.First_name + " " + u.Last_name,
                  ToUser = p.ToUser_id,
                  PublishDate = p.Sent_Datetime,
                  IsFile = p.IsFileAttached,
                  CategoryName = c.Category_name,
                  status_name = (from s in db.Status where (s.Id == p.status_id) select s.status_name).FirstOrDefault(),
                  Group_name = (from g in db.Groups where (g.Id == p.group_id) select g.Group_name).FirstOrDefault(),
                  FileSize = p.TotalFileSize,
              }).FilterForColumn(Sesssion["ColumnName"].ToString(), SearchText);

关于linq - 如何将字符串变量传递给 linq select new {} 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22225291/

相关文章:

c# - 方法无法转换为 LINQ 中的存储表达式

c# - 如何使用 LINQ2SQL 连接来自两个不同上下文的表?

c# - 加快从集合中查找数据范围

c# - 我如何修改此 C# 代码,以便 Visual Studio 识别出我不是白痴?

c# - Linq-to-SQL:在提交事务之前无法访问外键

c# - Linq to Sql 中的 ChangeConflictException

c# - Linq 到 SQL : Relations not correctly updated

c# - 推荐免费数据库用于 .net 应用程序中的商业用途

javascript - 通过中继器客户端循环

workflow - ASP.NET 3.5 Web 应用程序中的 Windows Workflow Foundation - 最佳方法