我正在尝试编写一个 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/