我目前在我的存储库中有一个方法,如下所示:
public int GetMessageCountBy_Username(string username, bool sent)
{
var query = _dataContext.Messages.AsQueryable();
if (sent)
query = query.Where(x => x.Sender.ToLower() == username.ToLower());
else
query = query.Where(x => x.Recipient.ToLower() == username.ToLower());
return query.Count();
}
它目前构建了两个基于sent
布尔值的查询之一。这是最好的方法吗?还是在查询本身中有这样的方法?如果sent
等于true,我想检查x.Sender
是否等于username
。但如果sent
等于false,我想检查x.Recipient
是否等于username
。
然后,我希望这个LINQ表达式在实体框架中转换为SQL,我相信它正在这样做。
我只是想尽量避免重复代码。
您可以这样做:
public int GetMessageCountBy_Username(string username, bool sent)
{
Func<Message, string> userSelector = m => sent ? m.Sender : m.Recipient;
var query =
_dataContext.Messages.AsQueryable()
.Where(x => userSelector(x).ToLower() == username.ToLower());
return query.Count();
}
因此,选择正确的用户(发送者或接收者)是在linq部分之前完成的,这样就可以避免重复两次。
是的,我相信这是正确的方法。因为创建复杂的查询很容易,而不需要重复查询的整个部分。
您关于转换为SQL的想法也是正确的。但请注意,这是在请求数据或协议时进行的。在您的情况下,SQL将在您调用Count()
时生成并执行。