LINQ query AND & OR

本文关键字:OR amp query AND LINQ | 更新日期: 2023-09-27 18:27:12

我要从.NET开始我的旅程,我需要一些帮助。

我会举例说明我的情况,我有什么,我需要做什么,但我不知道该怎么做。

所以我有一个像这样的课程

public class Ban
{
    public int ID { get; set; }
    public string Nick { get; set; }
    public string IP { get; set; }
    public string GroupName { get; set; }
}

和变量bans,其为IQueryable

然后在签名的方法中

public IEnumerable<Ban> FindBans(Ban filter);

我需要搜索bans变量;

我现在如何搜索

public IEnumerable<Ban> FindBans(Ban filter)
{
    var bans = GetBansQueryable();
    if (!string.IsNullOrWhiteSpace(filter.GroupName))
    {
        bans = bans.Where(b => b.GroupName == filter.GroupName);
    }
    if (!string.IsNullOrWhiteSpace(filter.Nick))
    {
        bans = bans.Where(b => b.Nick == filter.Nick);
    }
    if (!string.IsNullOrWhiteSpace(filter.IP))
    {
        bans = bans.Where(b => b.IP == filter.IP);
    }
    return bans.AsEnumerable();
}

使用AND进行过滤。SQL查询部分将类似于此

... WHERE group_name = 'abc' AND nick = 'def' AND ip = 'ghi';

我需要的是

... WHERE group_name = 'abc' AND (nick = 'def' OR ip = 'ghi');

所有这些都需要是动态的(如果我们不通过GroupName,就不要通过它进行过滤等)我不知道除了像一样手动制作这种动态之外,我还能如何实现这一点

if (!string.IsNullOrWhiteSpace(filter.GroupName) && 
    string.IsNullOrWhiteSpace(filter.Nick) && 
    string.IsNullOrWhiteSpace(filter.IP))
{
    bans = bans.Where(b => b.GroupName == filter.GroupName);
}
else if (!string.IsNullOrWhiteSpace(filter.GroupName) && 
    !string.IsNullOrWhiteSpace(filter.Nick) && 
    string.IsNullOrWhiteSpace(filter.IP))
{
    bans = bans.Where(b => b.GroupName == filter.GroupName && b.Nick == filter.Nick);
}
else if (!string.IsNullOrWhiteSpace(filter.GroupName) && 
    !string.IsNullOrWhiteSpace(filter.Nick) && 
    !string.IsNullOrWhiteSpace(filter.IP))
{
    bans = bans.Where(b => b.GroupName == filter.GroupName && (b.Nick == filter.Nick || b.IP == filter.IP));
}

等等…现在给Ban添加另一个变量。

LINQ query AND & OR

我认为您可以简化整个约束,如下所示:

bans = bans.Where(b => ( string.IsNullOrWhiteSpace(filter.GroupName) || b.GroupName == filter.GroupName )
                        &&
                        ( ( string.IsNullOrWhiteSpace(filter.Nick) || b.Nick == filter.Nick )
                          ||
                          ( string.IsNullOrWhiteSpace(filter.IP) || b.IP == filter.IP )
                        )
                 );

您可能想看看Scott Hansleman关于动态sql、谓词生成器和linqkit:的博客文章

每周源代码48-DynamicQueryable使自定义LINQ表达式更容易

另外,还有一篇关于使用Kendo UI网格和WebApi:的动态过滤器的非常好的博客文章

Kendo UI开源动态LINQ帮助程序

您可以在已知nick和ip的情况下进行特殊处理:

public IEnumerable<Ban> FindBans(Ban filter)
{
    var bans = GetBansQueryable();
    if (!string.IsNullOrWhiteSpace(filter.GroupName))
    {
        bans = bans.Where(b => b.GroupName == filter.GroupName);
    }
    if (!string.IsNullOrWhiteSpace(filter.Nick) && !string.IsNullOrWhiteSpace(filter.IP))
    {
        bans = bans.Where(b => b.Nick == filter.Nick || b.IP == filter.IP);
    }
    else if (!string.IsNullOrWhiteSpace(filter.Nick))
    {
        // filter.IP is empty
        bans = bans.Where(b => b.Nick == filter.Nick);
    }
    else if (!string.IsNullOrWhiteSpace(filter.IP))
    {
        // filter.Nick is empty
        bans = bans.Where(b => b.IP == filter.IP);
    }
    return bans.AsEnumerable();
}