LINQ查询AND&要么

时间:2014-10-20 11:11:49

标签: c# sql .net linq

我开始使用.NET,我需要一些帮助。

我将通过示例描述我的情况我拥有什么以及我需要做什么,但我不知道该怎么做。

所以我有一个这样的课程

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

和变量禁止 IQueryable

然后在签名方法

public IEnumerable<Ban> FindBans(Ban filter);

我需要搜索禁止变量;

我现在如何搜索

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。

3 个答案:

答案 0 :(得分:1)

我认为你可以像这样简化整个约束:

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 )
                        )
                 );

答案 1 :(得分:1)

您可能希望查看有关动态sql,谓词构建器和linqkit的Scott Hansleman博客文章:

The Weekly Source Code 48 - DynamicQueryable makes custom LINQ expressions easier

否则,有一篇关于在Kendo UI网格和Web Api中使用动态过滤器的非常好的博文:

Kendo UI Open Sources Dynamic LINQ Helpers

答案 2 :(得分:1)

你可以特别知道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();
}