【问题标题】:Should I keep adding conditions to my LINQ query or add a condition upfront and use two different queries?我应该继续向我的 LINQ 查询添加条件还是预先添加一个条件并使用两个不同的查询?
【发布时间】:2013-06-22 05:30:44
【问题描述】:

我有以下 LINQ 查询:

 var contents = _contentsRepository.GetAll()
            .Where(a => a.SubjectId == subjectId && 
                   a.ContentTypeId == contentTypeId && 
                   a.ContentStatusId == contentStatusId )
            .ToList();

我希望此选择正常进行,除非 contentStatusId == 99。如果是这样 在这种情况下,我希望它使用任何 contentStatusId 从数据库中检索一行。

最好先检查 contentStatusId,然后将其分解为 两个 LINQ 选择,或者有什么方法可以修改我的 LINQ 查询?

请注意,我使用的是 SQL Server 2012 和我的存储库:

public virtual IQueryable GetAll() { return DbSet; }

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    我相信您可以通过将contentStatusId == 99 组件添加到您的谓词来修改您的查询,这将使a.ContentStatusId == contentStatusId 的评估短路,如下所示:

    var contents = _contentsRepository.GetAll()
                .Where(a => a.SubjectId == subjectId && 
                       a.ContentTypeId == contentTypeId && 
                       (contentStatusId == 99 ||
                        a.ContentStatusId == contentStatusId))
                .ToList();
    

    在正常情况下,一切都会像以前一样工作。

    contentStatusId 等于 99 的情况下,对每一行评估 contentStatusId == 99 都会产生开销,尽管我认为根据存储库,您查询的这部分可以内联为 true。您应该亲自了解这如何影响您的设置中的性能。

    【讨论】:

    • 您认为这会对生成的 SQL 的性能产生任何影响,还是会在生成 SQL 之前发生?
    • 我的存储库返回一个 IQueryable 并连接到 SQL Server 2012。这是否可以更深入地了解可能的性能问题? public virtual IQueryable GetAll() { return DbSet; }
    • @Melina,这很可能不会在生成 SQL 查询期间进行优化(但您应该与 db.GetCommand(query).CommandText 核实),但我认为它应该由数据库优化。
    【解决方案2】:

    试试这个

    var contents = _contentsRepository.GetAll()
            .Where(a => contentStatusId == 99 ? (a.SubjectId == subjectId && 
                   a.ContentTypeId == contentTypeId && 
                   a.ContentStatusId == contentStatusId) : (a.SubjectId == subjectId && 
                   a.ContentTypeId == contentTypeId) )
            .ToList();
    

    【讨论】:

    • 嗨亚伦。如果 contentStatusId == 99,我仍然希望其他选择到位。
    • 修改了我的答案,现在如果 contentStatusId== 99,它将尝试匹配三列。否则,只匹配 subjectId 和 contentTypeId
    【解决方案3】:
    var contents = _contentsRepository.GetAll()             
                                      .Where(a => 
                                      {
                                          return a.ContentTypeId == 99 ||
                                          (a.SubjectId == subjectId && 
                                          a.ContentTypeId == contentTypeId && 
                                          a.ContentStatusId == contentStatusId)
                                      }
    

    【讨论】:

    • 对不起,如果我的问题不清楚。如果 contentStatusId 是 99,我仍然希望能够通过 subjectId 和 contentTypeID 进行选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多