【问题标题】:Trying to emulate a SQL IN statement on a series of SQL LIKE statements using LINQ尝试使用 LINQ 在一系列 SQL LIKE 语句上模拟 SQL IN 语句
【发布时间】:2012-10-11 19:38:43
【问题描述】:

我正在尝试使用 LINQ (C#) 在一系列 SQL LIKE 语句上模拟 SQL IN 语句。 我从一个名为 Query 的 IQueryable<user> 对象开始,该对象尚未被“过滤”。 我刚刚开始在 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 但仍然不是我希望的结果。它似乎返回的只是最后一个结果集,而不是所有附加的结果集。有人发现我做错了吗?

【问题讨论】:

    标签: c# sql linq union concat


    【解决方案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))); 
    } 
    

    【讨论】:

    • 效果很好!它总是简单的事情。非常感谢!
    【解决方案2】:

    试试这个:

    var query = this.Context.users.Where(u => 
        userFilter.Name.Contains.Any(c => u.Name.Contains(c))
        );
    

    【讨论】:

    • 感谢您的回复 D。我尝试了您的,但我一定没有正确实施它,因为它不起作用。幸运的是,NickW 的回应对我来说效果很好。
    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多