c# - Linq 到 SQL : Aggregating over ||

标签 c# linq linq-to-sql autocomplete aggregate

我正在尝试编写一个 Linq 查询,该查询获取名字或姓氏以字符串列表中的至少一个字符串开头的所有用户。这用于消息系统中收件人的自动完成。

这是我第一次天真的尝试:

var users = UserRepository.ALL()
foreach (var part in new [] { 'Ha', 'Ho', 'He' })
{
    string part1 = part; // "Copy" since we're coding lazily
    users = users.Where(x => x.LastName.StartsWith(part1) ||
                             x.FirstName.StartsWith(part1));
}

但这不起作用,因为结果变成了:

users.Where(a || b).Where(c || d).Where(e || f)...

...而我想要:

users.Where(a || b || c || d || e || f || ...)

我该怎么做?

最佳答案

您需要使用 2 个集合 - 在您的代码中,您正在过滤一个列表......实际上您需要过滤列表的集合 - 而不是已过滤多次的列表的集合。

一个作为匹配的存储库,另一个在你的循环中

var userCollection = new Collection<string>();
var users = UserRepository.ALL() 
foreach (var part in new [] { 'Ha', 'Ho', 'He' }) 
{ 
    string part1 = part; // "Copy" since we're coding lazily 
    var matches = users.Where(x => x.LastName.StartsWith(part1) || 
                             x.FirstName.StartsWith(part1)); 
    foreach (var i in matches)
    {
        userCollection.Add(i);
    }
} 

我并不是说这是最优雅的解决方案 - 只是想指出您的逻辑失败的原因。

你或许可以用 Contains 做点什么

var results= from i in collection 
            where idList.Contains(i.Id) 
            select i; 

只是看不出我的头脑有多乱

关于c# - Linq 到 SQL : Aggregating over ||,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3856601/

相关文章:

.net - 将图像从 SQL 中的 FILESTREAM 流式传输到浏览器的最快方法是什么?

c# - 使用 LINQ 时避免代码重复

LINQ 查询查找所有标签?

c# - Linq-to-SQL 结合两个 Expression<Func<T, bool>> ("where clause") 与 and/or

c# - MemberExpression : InvalidOperationExpression variable 'x' referenced from scope '' , 但未定义

c# - 查找两个列表之间的差异数

visual-studio-2008 - 在构建安装项目时,如何阻止 SQL Server 2008 R2 尝试安装某些程序包?

c# - 我需要找到一个好的 BSD 许可 C# SIP 软电话

c# - 如何从具体类转换为接口(interface)类型?

c# - 如何在 ASP.NET Web API 内存测试中添加客户端证书?