0

リポジトリで、私はこれを行います:

public AgenciesDonor FindPrimary(Guid donorId) {
    return db.AgenciesDonorSet.Include("DonorPanels").Include("PriceAdjustments").Include("Donors").First(x => x.Donors.DonorId == donorId && x.IsPrimary);
}

次に、同じリポジトリ内の別のメソッドでダウンします。これは次のとおりです。

AgenciesDonor oldPrimary = this.FindPrimary(donorId);

デバッガーでは、結果ビューにそのテーブルのすべてのレコードが表示されますが、次のようになります。

oldPrimary.Count(); 

は 1 です (そうあるべきです)。

1 つだけではなく、すべてのテーブル エントリが取得されているのはなぜですか? DBで行フィルタリングが行われていると思いました。

db.EntitySet が実際にすべてをクライアントにフェッチする場合、EF を使用してクライアントのデータライトを維持する正しい方法は何ですか? すべての行をフェッチしても、私がやっていることには対応できません。

4

2 に答える 2

0

Entity Set は IQueryable を実装していないため、使用している拡張メソッドはIEnumerable拡張メソッドです。ここを参照してください:

http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/121ec4e8-ce40-49e0-b715-75a5bd0063dc/

私はこれがばかげていることに同意し、それについて不平を言う人が増えていないことに驚いています. 正式な理由:

EntitySet を IQueryable にしない設計上の理由は、EntitySet の Add\Remove を IQueryable のフィルタリングおよび変換機能と調和させる明確な方法がないためです。

于 2011-01-09T21:42:32.387 に答える
0

LINQ to Entities (または SQL) は遅延実行を使用するため、AgenciesDonorSet にカーソルを合わせるとすべてが表示されます。クエリが実際に実行されると、カウントを取得するだけです。

任意のクエリに対して生成されている SQL を表示する場合は、次のコードを追加できます。

var query = queryObj as ObjectQuery; //assign your query to queryObj rather than returning it immediately

if (query != null)
{
    System.Diagnostics.Trace.WriteLine(context);
    System.Diagnostics.Trace.WriteLine(query.ToTraceString());
}
于 2009-11-17T21:28:30.680 に答える