2011-08-23 110 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发送到客户端。