我目前在我的存储库上有一个方法,如下所示:
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
布尔值构建两个查询之一。这是最好的方法吗?还是有办法在查询本身内执行此操作?如果x.Sender
等于true,我想检查username
是否等于sent
。但是,如果x.Recipient
等于false,我想检查username
是否等于sent
。
然后我希望这个LINQ表达式在Entity Framework中转换为SQL,我相信它正在做。
我只是想避免重复尽可能多的代码。
答案 0 :(得分:2)
是的,我相信这是正确的方法。因为很容易创建复杂的查询而不重复查询的整个部分。
您对转换为SQL的想法也是正确的。但要注意,这是在请求数据或聚合时立即完成的。在您的情况下,当您调用Count()
时,将生成并执行SQL。
答案 1 :(得分:2)
你可以这样做:
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部分之前完成的,这样可以避免重复两次。