【发布时间】:2019-10-17 14:24:02
【问题描述】:
我正在尝试优化以下例程,使其仅使用一个数据库查询而不是多个,但过滤器(循环条件)似乎并未应用,因为所有消息都已获取。
public async Task<List<Message>> GetInboxMessegesFromUser(string inboxUser, List<string> senders)
{
// Doesn't work
var query = from m in _context.Messeges where m.ToUser == inboxUser select m;
foreach (string sender in senders)
{
query.Where(m => m.FromUser == sender);
}
return await query.ToListAsync();
// Old code
List<Message> messeges = new List<Message>();
foreach (string sender in senders)
{
messeges.AddRange(await _context.Messeges.Where(m => m.FromUser == sender && m.ToUser == inboxUser).ToListAsync());
}
return messeges;
}
如何在执行之前向 LINQ 查询添加动态数量的条件,以便 O(N*M) 变为 O(N)?
【问题讨论】:
-
替换:
query = query.Where(m => m.FromUser == sender); -
另外,这在您的场景中会比 foreach 更有效:stackoverflow.com/questions/10667675/…
-
即使在分配
query = query.Where(....);之后,由于逻辑错误,该查询也不会产生任何结果。您不能在属性上拥有超过 1 个值的记录。因此,如果您在senders列表中传入 2 个值,则任何一条记录都不会是这两个值。结果是这个方法总是返回一个空列表。