6

Entity Frameworkを使用するときに、呼び出しチェーンのどこに呼び出しを含める必要があるのか​​知りたいです。次の方法を検討してください。

// sample usage from service layer
// _customerRepository.Paginate(1, out totalRecords, 25, "DateJoined DESC, AmountSpent", "DateJoined >= '2009-02-01'", "Invoices, Refunds");
public virtual IQueryable<T> Paginate(int page, out int total, int pageSize, string sort = "Id", string filter = null, string includes = null)
{
    IQueryable<T> query = DatabaseSet;

    total = query.Count(); // get total # of records (required for pagination)...
    var skipTo = GetValidSkipCount(page, total, pageSize);

    if (!String.IsNullOrWhiteSpace(filter))
    {
        query.Where(filter);
    }
    // should includes be before filtering? 
    // should query.Count() be called after query.Include? 
    // does it matter?
    if (!String.IsNullOrWhiteSpace(includes))
    {
        query.IncludeMany(includes); // my own extension that takes comma separated string of entities to include
    }

    return query.OrderBy(sort).Skip(skipTo).Take(pageSize);
}

私の質問は次のとおりです。

  1. インクルードは常にコールチェーンの最初にある必要がありますか?
  2. Count()はインクルードの影響を受けますか?もしそうなら、私はインクルード後にカウントするべきだと思います
  3. フィルタリングの前または後に含める必要がありますか(場所)?
  4. EFはすべてを理解するのに十分「賢い」ので、それは本当に重要ですか?
4

1 に答える 1

10

インクルードは常にコールチェーンの最初にある必要がありますか?

Includeチェーンの最初である必要はありません。Includeクエリの一部ではない非常に特殊な演算子です。これは、クエリの拡張のようなものです。また、LINQ演算子ではありません-EF演算子で定義されていますObjectQuery<T>IQueryable<T>拡張機能とDbQuery<T>バージョンの両方が内部的にこの実装に到達します)。Tは、クエリの形状とのルートを定義しますIncludeIncludeクエリの結果の形状が呼び出しで使用されるルートと一致する場合にのみ使用されIncludeます。したがって、を追加Includeして呼び出しをIQueryable<T>返し、クエリが返される場合は適用されIQueryable<T>ますIncludeが、たとえばIQueryable匿名タイプのクエリが返される場合は、クエリの形状を変更したため、Include適用されません。

Count()はインクルードの影響を受けますか?もしそうなら、私はインクルード後にカウントするべきだと思います

IncludeCountクエリを実行する場合は使用されません。Countクエリを実行し、データレコードセットを返しません-形状を変更し、含めるものはありません。

フィルタリングの前または後に含める必要がありますか(場所)?

それは問題ではないはずです。インクルードは結合を作成します。EF(クエリを作成する場合)とデータベースのクエリエンジン(クエリを実行する場合)の両方で、結合を適用する前にフィルタリングを使用する必要があります。

EFはすべてを理解するのに十分「賢い」ので、それは本当に重要ですか?

クエリの形状を変更する場合にのみ重要です。つまり、射影またはカスタム結合を使用します。このような場合Include、以前の形状は失われます(まったく使用されません)。

于 2012-06-05T17:32:35.110 に答える