回答
你試圖實現的是在LINQ中編寫一個動態查詢。你可以用兩種方法做到這一點:
- 使用dynamic LINQ;
- 使用約瑟夫阿爾巴哈里的PredicateBuilder(在這種情況下推薦);
簡單地說,這是如何在你的情況下使用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);
我假設你想建立自己的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 - 斯科特顧的演示接近你所描述的東西,包括一個庫和一些示例代碼...
我想你說的是基於最初未知數量的條件過濾對象。
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子句。
你想要做的是有如下因素簽名
public void Filter(Func<Account, bool> filterExpression)
{
list.Where(filterExpression).ToList();
}
這種方式可以支持濾波的UI各種情況的方法。
不打破你(我假設)存儲庫的封裝,這就是爲什麼我做ToList()
所以沒有IQueryable
發送到客戶端。
- 1. 使用集合參數針對集合屬性的Linq查詢
- 2. 與Linq同時查詢兩個集合
- 3. LINQ查詢更新相同的集合?
- 4. 用linq查詢集合的子集合
- 5. 使用Linq查詢集合集合
- 6. Linq查詢排序集合
- 7. LInq查詢收藏集合
- 8. LINQ查詢排序集合
- 9. 的LINQ查詢不填充子集合
- 10. 合併同類LINQ查詢
- 11. LINQ其中查詢不同派生類的集合
- 12. Firebase查詢參考/集合
- 13. 使用集合參數的GAE查詢
- 14. MongoDB查詢與計數相同集合
- 15. 篩選父集合通過LINQ查詢
- 16. C#LINQ查詢過濾器子集合
- 17. 在LINQ中查詢子集合
- 18. ISet集合上的Linq查詢
- 19. LINQ查詢取決於孫集合
- 20. Linq查詢結果到列表集合
- 21. 使用LINQ查詢對象的集合
- 22. 使用Linq查詢截斷集合
- 23. 查詢子集合2個水平LINQ
- 24. 複雜的Linq集合查詢
- 25. linq動態查詢未填充集合
- 26. 傳遞參數LINQ查詢
- 27. LINQ查詢 - 匹配參數
- 28. Mutli參數Linq查詢
- 29. LINQ查詢異類集合中具有相同基類的不同類型
- 30. 不同的Linq查詢組
I M在內存中收集查詢的。所以SQL注入不是一個問題。和編號喜歡建立在哪裏,並通過配件組等。 – DarthVader
看到我的答案中的鏈接,它確實bsically(不知道有關限制)... – Yahia
順便說一句:無論是「內存中」還是沒有做出差異 - 「類似SQL注入」意味着用戶可能會提供參數,使您的動態LINQ的行爲方式,你不想... – Yahia