EF: where 節に含める [重複] 。
質問
タイトルが示唆するように、私はincludeと組み合わせてwhere句を行う方法を探しています。
以下は私の状況です。 私は、コードの匂いでいっぱいの大規模なアプリケーションのサポートに責任があります。 あまりに多くのコードを変更すると、いたるところでバグが発生するので、私は最も安全な解決策を探しています。
例えば、BusとPeopleというオブジェクトがあるとします(BusはPeopleのナビゲーションプロップコレクションを持っています)。 私のクエリでは、起きている乗客だけを乗せたすべてのバスを選択する必要があります。これは単純化したダミーの例です。
現在のコードでは
var busses = Context.Busses.Where(b=>b.IsDriving == true);
foreach(var bus in busses)
{
var passengers = Context.People.Where(p=>p.BusId == bus.Id && p.Awake == true);
foreach(var person in passengers)
{
bus.Passengers.Add(person);
}
}
このコードの後、Contextは破棄され、呼び出しメソッドの中で、結果のバスエンティティはDTOクラス(Entityの100%コピー)にマッピングされます。
このコードはDBへの複数回の呼び出しを引き起こし、それはダメなので、次の解決策を見つけました。 MSDN ブログ
これは、結果をデバッグするときはうまくいきましたが、エンティティを DTO にマッピングするとき (AutoMapper を使用)、コンテキスト/接続が閉じられたため、オブジェクトをロードできないという例外が発生します。(コンテキストは常に閉じており、これを変更することはできません :( ))
そこで、選択された Passengers がすでにロードされていることを確認する必要があります (ナビゲーション プロパティの IsLoaded も False です)。Passengersコレクションを検査すると、Countも例外を投げますが、Passegersコレクションに「wrapped related entities」というコレクションもあり、そこには私のフィルタリングされたオブジェクトが含まれています。
これらのラップされた関連エンティティを全体のコレクションにロードする方法はありますか? (これはアプリケーション全体で使用されるため、オートマッパーマッピングの設定を変更することはできません)。
Active Passengersを取得する他の方法はありますか?
何かヒントがあれば教えてください。
編集
Gert Arnold氏の回答は、データがeagerlyにロードされていないため、動作しません。 しかし、私はそれを簡素化し、場所を削除すると、それはロードされます。実行SQLは両方のケースですべての乗客を返すので、これは本当に奇妙なことです。したがって、結果をエンティティに戻すときに問題があるに違いありません。
Context.Configuration.LazyLoadingEnabled = false;
var buses = Context.Busses.Where(b => b.IsDriving)
.Select(b => new
{
b,
Passengers = b.Passengers
})
.ToList()
.Select(x => x.b)
.ToList();
編集2
苦労の末、Gert Arnold氏の回答はうまくいきました! Gert Arnold が提案したように、レイジーローディングを無効にして、それをオフのままにしておく必要があります。 前の開発者がレイジーローディングを好んだので、これはアプリケーションにいくつかの余分な変更を要求します -_-。
どのように解決するのですか?
現在 EFコア5.0 's フィルタが含まれる メソッドは、含まれるエンティティのフィルタリングをサポートするようになりました。
var busses = _Context.Busses
.Include(b => b.Passengers
.Where(p => p.Awake))
.Where(b => b.IsDriving);
関連
-
[解決済み] このコマンドに関連する開いているDataReaderがすでにあり、最初にそれを閉じる必要があります。
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] require, include, require_once, include_onceの違い?
-
[解決済み] SQL JOIN - WHERE句とON句の比較
-
[解決済み] HTML ファイルに別の HTML ファイルをインクルードする
-
[解決済み] Entity Framework - 複数レベルのプロパティを含める
-
[解決済み】Where句を使った左結合
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
-
[解決済み] EF Coreのインクルードでのフィルタリング