所以我有这个linq查询条款。
var ctx = new Context();
IQueryable<Users> consulta = ctx.Users;
if ( filters.Count > 0 )
query = query.Where( p => filters.Contains(p.Name) ||
filters.Contains(p.LastName) );
过滤器
是一个包含无序名称和姓氏的字符串列表(不一定是完整的)。例如:过滤{Mary,Joseph Ken}但是DB {Mary Katie,Joseph Kendall}。
预期结果
对于以前的过滤器,我希望查询返回用户列表,无论过滤器中的名称和姓氏是否不完整但是正确。因此,如果过滤器具有“Mary”,则它必须找到带有“Mary Katie”的db记录,依此类推。
答案 0 :(得分:3)
我认为你想要的是一个过滤器
Bob
Alice
Jane
和查询中的项目,例如
Bob Nob
Alice Howzer
Jane Bob
Tim
你会得到
Bob Nob
Alice Howzer
Jane Bob
因为过滤器匹配了姓或名的任何部分吗?
为什么不在您的集合中添加类似
的扩展方法public static bool IsInAny(this IEnumerable<String> source, string name, string delim = " ")
{
return source.Any(item =>
{
var splits = name.Split(new[] { delim }, StringSplitOptions.RemoveEmptyEntries);
return splits.Contains(item);
});
}
这是一个可以用来测试它的测试
[Test]
public void TestInAny()
{
var filters = new[] {"Bob", "Alice"};
var items = new[] {"Bob Knob", "Alice Jane", "Tim"};
var found = items.Where(i => filters.IsInAny(i)).ToList();
}
显然,这只是一种快速而肮脏的方式,并且有更简洁的方法,但至少现在你已经封装了逻辑。
答案 1 :(得分:2)
您可以使用String.Contains
和Any
的混合来解决linq实体中的问题,而无需从DB中获取额外数据:
var ctx = new Context();
IQueryable<Users> consulta = ctx.Users;
if ( filters.Count > 0 )
query = query.Where( p => filters.Any(x=>x.Contains(p.Name)) ||
filters.Any(x=>x.Contains(p.LastName)) ||
filters.Any(x=>p.Name.Contains(x)) ||
filters.Any(x=>p.LastName.Contains(x)));
答案 2 :(得分:0)
也许是这些方面的东西?我实际上没有测试过,所以买家要小心。
public static bool IsIn(this string value, IEnumerable<string> compareList)
{
foreach (string compareValue in compareList)
{
if (value.Contains(compareValue))
return true;
}
return false;
}