0

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

4

3 回答 3

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

显然这只是一种快速而肮脏的方式,并且有更干净的方式来做,但至少现在你已经封装了逻辑。

于 2012-04-05T22:00:06.217 回答
2

您可以使用 mix ofString.ContainsAny来解决 linq2entity 中的问题,而无需从 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)));
于 2012-04-05T22:04:25.290 回答
0

也许沿着这些思路?我还没有实际测试过,所以买家要小心。

public static bool IsIn(this string value, IEnumerable<string> compareList)
{
   foreach (string compareValue in compareList)
   {
        if (value.Contains(compareValue))
                return true;
   }
        return false;
}
于 2012-04-05T22:27:23.860 回答