1

我正在尝试使用 LINQ (C#) 在一系列 SQL LIKE 语句上模拟 SQL IN 语句。我从一个IQueryable<user>尚未“过滤”的名为 Query 的对象开始。我刚开始在 Stack Overflow 上发帖,所以请耐心等待我 :)...

ObjectQuery<user> Context = this.Context.users;
IQueryable<user> Query = (IQueryable<user>)Context;
// create a BLANK clone of the FULL list (Query)
var QueryFinal = Query.Where(i => i.ID == 0);
foreach (String Item in userFilter.Name.Contains)
{
    // based on the FULL list (Query) return all records that apply to this item & then append results to the final list
    QueryFinal = QueryFinal.Concat(Query.Where(i => i.Name.Contains(Item)));
}
return QueryFinal.ToList();

我认为在每次迭代中,在 Query.Where 语句上返回的结果集将被附加到 QueryFinal 列表中,它确实如此,但由于某种原因,在每次后续迭代中,它似乎覆盖了所有先前的记录应该在最终列表中“保存以供保管”。我也尝试过使用 .Union 但仍然不是我希望的结果。它似乎返回的只是最后一个结果集,而不是所有附加的结果集。有人发现我做错了什么吗?

4

2 回答 2

1

由于延迟执行,当您调用 时QueryFinal.ToList();,它将使用最后一个值- 这是在循环Item中执行此类查询时非常常见的问题。foreach

在您的情况下,这样的事情可能会有所帮助:

foreach (String Item in userFilter.Name.Contains) 
{ 
    string currentItem = Item;
    // based on the FULL list (Query) return all records that apply to this item & then append results to the final list 
    QueryFinal = QueryFinal.Concat(Query.Where(i => i.Name.Contains(currentItem))); 
} 
于 2012-10-22T01:36:08.047 回答
0

尝试这个:

var query = this.Context.users.Where(u => 
    userFilter.Name.Contains.Any(c => u.Name.Contains(c))
    );
于 2012-10-22T01:31:35.727 回答