1

次の LINQ クエリがあります。

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

contentStatusId == 99 でない限り、この選択を正常に続行したいと思います。その場合は、ANY contentStatusId を使用してデータベースから行を取得します。

最初に contentStatusId のチェックを行ってから、これを 2 つの 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 に答える