2014-10-22 36 views
2

我想構建一個動態查詢,如果對象的值不是空字符串,就能夠擴展where子句條件。下面是過濾對象的代碼在where子句中構建動態linq查詢

public IEnumerable<Filter> GetFilter(Filter filter) 
{ 
    var y = ConditionalAttribute(filter); 
    var query = 
     from sub in Subscriptions 
     join u in Users 
     on sub.UserID equals u.Id 
     join od in Order_Details1 
     on sub.OD_Id equals od.OD_Id 
     join p in Products 
     on od.ProductId equals p.ProductId 
     where p.Type == "Testing" + y 
     select new Filter 
     { 
      //do something 
     }; 

,這裏是代碼

public class Filter 
{ 
    public int UserId { get; set; } 
    public string FirstName { get; set;} 
} 

的想法是,如果filter.FirstName不爲空,將追加這樣

public String ConditionalAttribute(Filter filter) 
{ 
    if(filter.FirstName != "") 
     return "&& u.First_Name = " + filter.FirstName + "";   
} 
where子句

有沒有什麼辦法像上面的代碼一樣通過字符串來附加where子句?因爲我試過上面的方法,所以失敗了,謝謝

+0

這不是簡單或容易,除非你已經在使用一個框架,爲你做繁重的工作..我想,你想要這樣的東西 - http://dynamiclinq.codeplex.com/ – 2014-10-22 03:58:13

回答

1

創建儘可能多的動態項,以便在返回IQueryable的小方法中使用。

public IQueryable ConditionalAttribute(IQueryable query, Filter filter) 
{ 
    if(filter.FirstName != "") { 
     query = query.Where(x => x.First_Name == filter.FirstName); 
    } 

    return query; 
} 

則初始LINQ語句後應用它們,你需要:

public IEnumerable<Filter> GetFilter(Filter filter) 
{ 
    var query = 
     from sub in Subscriptions 
     join u in Users 
     on sub.UserID equals u.Id 
     join od in Order_Details1 
     on sub.OD_Id equals od.OD_Id 
     join p in Products 
     on od.ProductId equals p.ProductId 
     where p.Type == "Testing" 
     select new Filter 
     { 
      //do something 
     }; 

     query = ConditionalAttribute(query, filter); 

聲明不會運行,直到你的項目成通過.ToList()或FirstOrDefault()或像這樣的東西,所以你可以按照你需要的方式多次連續查詢。

0

我傾向於使用標準的C#語法而不是LINQ語法,但是,說到這一點,我發現LINQ語法在加入查詢時更加優雅。

下面是一種利用標準C#語法動態過濾源容器,然後使用LINQ語法創建加入查詢的方法。

public IEnumerable<Filter> GetFilter(Filter filter) 
{ 
    var y = ConditionalAttribute(filter); 

    IEnumerable<User> filteredUsers = Users; 
    if(!string.IsNullOrEmpty(filter.FirstName)) 
    { 
     filteredUsers = filteredUsers.Where(u => u.First_Name == filter.FirstName); 
    } 

    var query = 
     from sub in Subscriptions 
     join u in filteredUsers 
     on sub.UserID equals u.Id 
     join od in Order_Details1 
     on sub.OD_Id equals od.OD_Id 
     join p in Products 
     on od.ProductId equals p.ProductId 
     where p.Type == "Testing" + y 
     select new Filter 
     { 
      //do something 
     };