次の結果行が生成されず、Firstが例外をスローするようなクエリをEFが生成するのはなぜですか?なぜこのEFクエリは結果にCountを含めるにもかかわらず結果を返しませんか?
IQueryable<EntityName> repo = GetQuery<EntityName>();
IQueryable<EntityName> query = repo.Where(x => x.Discriminator == 1);
var result = repo.Select(x => new
{
TotalRecords = query.Count(),
Results = query.Skip(request.Skip).Take(request.Take).ToList()
}).First();
このトリックでは、EFでの1回のデータベース呼び出しで複数のクエリを実行できます。私は任意のリポジトリrepo
を呼び出し、各プロパティがサブクエリである新しいオブジェクトを返します。これは、query
IQueryableにレコードがある限り機能します。しかし、query
にレコードがない場合、何も返されない(つまり、query.Count()は結果に含まれていない)ことに驚きました。私は、このようなクエリは、Count()に関係するので、query
にエンティティがなくても結果行を生成するはずだと考えましたが、何も返しません。私はこれが、フードの下で単一の平坦な結果セットを生成しなければならないEFと関係があると考えています。
「選択」内に何があるかは関係ありません。結果のカウントは入力セットと常に同じです。 'First'(または' Take(1) ')は、最大1、すなわち0または1に制限することができます。これは基本的にEFではなくSQLクエリの動作です。 –