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

时间:2011-05-25 04:50:40

标签: c# sql linq entity-framework

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

    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,我相信它正在做。

我只是想避免重复尽可能多的代码。

2 个答案:

答案 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部分之前完成的,这样可以避免重复两次。