我应该继续向LINQ查询添加条件,还是提前添加一个条件并使用两个不同的查询

本文关键字:条件 添加 查询 两个 一个 LINQ 我应该 继续 | 更新日期: 2023-09-27 18:19:32

我有以下LINQ查询:

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

我希望此选择正常进行,除非contentStatusId==99。如果是在这种情况下,我希望它从数据库中检索具有ANY contentStatusId的行。

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

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

公共虚拟IQueryable GetAll(){return DbSet;}

我应该继续向LINQ查询添加条件,还是提前添加一个条件并使用两个不同的查询

我相信您可以通过在谓词中添加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。您应该亲眼看到这对设置性能的影响。

试试这个

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