LINQ使用不同参数查询集合

时间:2011-08-23 14:47:34

标签: c# .net linq dynamic

我有一个列表,我需要根据用户传递给我的程序的10个不同参数进行查询。

最好的方法是什么?

前:

List<Users>   

查询参数可以是:用户名和/或用户ID和/或年龄等。

4 个答案:

答案 0 :(得分:0)

我假设您要动态构建Linq查询的where部分 - 我不建议通过字符串(请参阅下面的链接),因为它可能会引入类似于SQL注入的内容LINQ,即以你不想要的方式用用户提供的参数更改LINQ查询的行为......

那说检查这个链接http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx - Scott Gu演示了一些接近你所描述的内容,包括一个库和一些示例代码...

答案 1 :(得分:0)

我猜你在谈论根据最初未知数量的条件过滤对象。

LINQ不会在您通过枚举(使用foreach,ToList(),ToArray()...)明确询问之前评估您的查询。当你这样做时,根据LINQ(SQL,对象,XML等)的实现,将优化查询。

AFAIK,所有实施都能够将“where condition1 where condition2”优化为“where condition1&amp;&amp; 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-to-SQL,那么可以是一个表,如果你正在使用LINQ-to-XML,那就是ChildNodes()。尝试在之前使用where子句枚举最少的

答案 2 :(得分:0)

你想要做的是拥有一个带有下面签名的方法

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

这样您就可以支持在UI上对各种场景进行过滤。

不破坏您(我假设)存储库的封装,这就是我ToList()所以没有IQueryable被发送到客户端的原因。

答案 3 :(得分: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);