如何构造部分动态的LINQ语句



我目前在我的存储库中有一个方法,如下所示:

    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()时生成并执行。

相关内容

  • 没有找到相关文章

最新更新