2011-08-23 115 views
0

我有一個列表,我需要根據用戶傳遞給我的程序的大約10個不同參數進行查詢。LINQ查詢不同參數集合

最好的辦法是什麼?

例如:

List<Users> 

查詢參數可以是:用戶名和/或用戶ID和/或年齡等

回答

0

你試圖實現的是在LINQ中編寫一個動態查詢。你可以用兩種方法做到這一點:

簡單地說,這是如何在你的情況下使用PredicateBuilder:

var predicate = PredicateBuilder.True<User>(); 
if (!string.IsNullOrWhitespace(username)) 
    predicate = predicate.And(a => a.Username == username); 
if (!string.IsNullOrWhitespace(whatever)) 
    predicate = predicate.And(a => a.Whatever == whatever); 
/* etc. etc. */ 

var filteredUsers = myUsers.Where(predicate); 
0

我假設你想建立自己的Linq查詢的where部分動態 - 我不建議通過一個字符串(請參閱下面的鏈接),因爲它可能會引入類似於SQL注入到LINQ的東西,即以不想要的方式使用用戶提供的參數更改LINQ查詢的行爲。 ..

That che che這個鏈接出去http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx - 斯科特顧的演示接近你所描述的東西,包括一個庫和一些示例代碼...

+0

I M在內存中收集查詢的。所以SQL注入不是一個問題。和編號喜歡建立在哪裏,並通過配件組等。 – DarthVader

+0

看到我的答案中的鏈接,它確實bsically(不知道有關限制)... – Yahia

+0

順便說一句:無論是「內存中」還是沒有做出差異 - 「類似SQL注入」意味着用戶可能會提供參數,使您的動態LINQ的行爲方式,你不想... – Yahia

0

我想你說的是基於最初未知數量的條件過濾對象。

LINQ不會評估你的查詢,除非你明確地通過枚舉它來詢問(使用foreach,ToList(),ToArray()...)。當你這樣做時,根據LINQ(SQL,對象,XML等)的實現,查詢將被優化。所有的實現都可以優化「where condition1 where condition2」爲「where condition1 & & condition2」。

這意味着你只需要逐個添加你的過濾條件。例如:

private List<User> FilterUsers(string username, string userid, int? minAge, int? maxAge) 
{ 
    IEnumerable<User> query = GetUsers(); 
    if (!string.IsNullOrEmpty(username)) query = query.Where(u => u.Username.StartsWith(username); 
    if (!string.IsNullOrEmpty(userid)) query = query.Where(u => u.Userid == userid); 
    if (minAge != null) query = query.Where(u => u.Age >= minAge.Value); 
    if (maxAge != null) query = query.Where(u => u.Age <= maxAge.Value); 

    return query.ToList(); 
} 

這裏GetUsers()應該返回一個IEnumerable。如果您使用的是LINQ到SQL,則可以是表格,如果您使用的是LINQ到XML,則可以是ChildNodes()。嘗試枚舉儘可能少的之前應用您的where子句。

0

你想要做的是有如下因素簽名

public void Filter(Func<Account, bool> filterExpression) 
    { 
     list.Where(filterExpression).ToList(); 
    } 

這種方式可以支持濾波的UI各種情況的方法。

不打破你(我假設)存儲庫的封裝,這就是爲什麼我做ToList()所以沒有IQueryable發送到客戶端。