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添加另一个变量。
我认为您可以简化整个约束,如下所示:
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();
}