1

我有以下 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; }

4

3 回答 3

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. 您应该亲自了解这如何影响您的设置中的性能。

于 2013-06-22T05:37:59.957 回答
1

尝试这个

var contents = _contentsRepository.GetAll()
        .Where(a => contentStatusId == 99 ? (a.SubjectId == subjectId && 
               a.ContentTypeId == contentTypeId && 
               a.ContentStatusId == contentStatusId) : (a.SubjectId == subjectId && 
               a.ContentTypeId == contentTypeId) )
        .ToList();
于 2013-06-22T05:39:38.540 回答
0
var contents = _contentsRepository.GetAll()             
                                  .Where(a => 
                                  {
                                      return a.ContentTypeId == 99 ||
                                      (a.SubjectId == subjectId && 
                                      a.ContentTypeId == contentTypeId && 
                                      a.ContentStatusId == contentStatusId)
                                  }
于 2013-06-22T05:39:45.583 回答