2014-03-06 16 views
2

我只是想通過多個ColumnNames存儲到會話變量的linq進行搜索功能。我用了一個方法:如何將字符串變量傳遞給linq選擇新的{}節

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

這已存儲會話價值的三大字符串變量。

現在我只是想傳遞的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。

+0

請把更多的精力投入到格式化你的代碼。您的帖子的最初版本的查詢里程大部分都在右側。在發佈之前查看預覽,並確保它是*如果您正在閱讀並希望回答的話,您會希望它看起來如何。 –

+0

(我也用英文編輯了這篇文章,但是我不明白最後一句話,所以你可能想進一步編輯以澄清它。) –

回答

3

我會爲這種事情做一個擴展方法,爲你的謂詞建立一個表達式。

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); 
+0

我必須在App_Code中用Helper創建一個Class文件並且繼承內容頁面類。 –

+0

這裏的錯誤發生如下:'無法找到類型或名稱空間名稱'T' –

+0

@shal是的,已更正,它應該是'FilterForColumn '另一個屬性表達式應該是propertyExpression的拼寫錯誤。 –

相關問題