我开始使用.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。
答案 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中使用动态过滤器的非常好的博文:
答案 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();
}