LINQ查询模仿IS IN

时间:2012-04-05 21:41:56

标签: c# linq linq-to-entities ef-code-first

所以我有这个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记录,依此类推。

3 个答案:

答案 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.ContainsAny的混合来解决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;
}