当前位置:  开发笔记 > 编程语言 > 正文

条件Linq查询

如何解决《条件Linq查询》经验,为你挑选了5个好方法。

我们正在研究日志查看器.该用户可以选择按用户,严重程度等进行过滤.在Sql中我会添加到查询字符串,但我想用Linq来做.我怎样才能有条件地添加where-clause?



1> Darren Kopp..:

如果您只想过滤某些标准,请执行以下操作

var logs = from log in context.Logs
           select log;

if (filterBySeverity)
    logs = logs.Where(p => p.Severity == severity);

if (filterByUser)
    logs = logs.Where(p => p.User == user);

这样做可以使Expression树完全符合您的要求.这样,创建的SQL将完全符合您的需求而且不会少.


嗨你有什么建议使用where子句OR而不是ANDs ..?

2> 小智..:

如果需要基于List/Array过滤,请使用以下命令:

    public List GetData(List Numbers, List Letters)
    {
        if (Numbers == null)
            Numbers = new List();

        if (Letters == null)
            Letters = new List();

        var q = from d in database.table
                where (Numbers.Count == 0 || Numbers.Contains(d.Number))
                where (Letters.Count == 0 || Letters.Contains(d.Letter))
                select new Data
                {
                    Number = d.Number,
                    Letter = d.Letter,
                };
        return q.ToList();

    }


这是迄今为止最好和最正确的答案.条件|| 只比较第一部分并跳过第二部分,如果第一部分是真的...很好地完成!

3> sgwill..:

我结束使用类似于Daren的答案,但使用了IQueryable接口:

IQueryable matches = m_Locator.Logs;

// Users filter
if (usersFilter)
    matches = matches.Where(l => l.UserName == comboBoxUsers.Text);

 // Severity filter
 if (severityFilter)
     matches = matches.Where(l => l.Severity == comboBoxSeverity.Text);

 Logs = (from log in matches
         orderby log.EventTime descending
         select log).ToList();

这会在命中数据库之前构建查询.该命令直到最后的.ToList()才会运行.



4> Lars Mæhlum..:

当涉及到条件linq时,我非常喜欢过滤器和管道模式.
http://blog.wekeroad.com/mvc-storefront/mvcstore-part-3/

基本上,您为每个过滤器案例创建一个扩展方法,该过滤器案例包含IQueryable和一个参数.

public static IQueryable HasID(this IQueryable query, long? id)
{
    return id.HasValue ? query.Where(o => i.ID.Equals(id.Value)) : query;
}



5> Ryan..:

我用扩展方法解决了这个问题,该方法允许在流利的表达式中间有条件地启用LINQ。这样就无需用if语句将表达式分开。

.If() 扩展方法:

public static IQueryable If(
        this IQueryable source,
        bool condition,
        Func, IQueryable> branch)
    {
        return condition ? source : branch(source);
    }

这使您可以执行以下操作:

return context.Logs
     .If(filterBySeverity, q => q.Where(p => p.Severity == severity))
     .If(filterByUser, q => q.Where(p => p.User == user))
     .ToList();

这也是一个IEnumerable可以处理大多数其他LINQ表达式的版本:

public static IEnumerable If(
    this IEnumerable source,
    bool condition,
    Func, IEnumerable> branch)
    {
        return condition ? source : branch(source);
    }

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有