0

これは、私が数日前に投稿した別の質問からのスピンオフであり、正常に回答されましたが、実際には私が抱えていた根本的な問題には触れていませんでしたが、元のクエリでは完全に表現できませんでした.

私はテーブル製品を持っています。Product は、1 対多の関係で ProductDescription に関連付けられています。ProductDescription には、製品ごとに複数の行を含めることができます。商品の説明に複数の翻訳がある場合は、複数の行になります。Product は Language と多対 1 の関係にあります。Language には、言語コード (en、es など) と LanguageId (ProductDescription にもあります) があります。

ユーザーが製品をリクエストできるようにし、さらに特定の言語でその製品の説明のみを返すようにアプリケーションに指示したいと考えています。

私が抱えている問題は、この質問の 3 番目の段落のタスクを達成するためにプロジェクションを使用する必要があることを理解していることです。このようなもの:

    var query = inventoryRepository.Products
                        .Where(wherePredicate)
                        .Select( a=> new Product
                        {
                            ProductDescriptions = inventoryRepository.ObjectContext.ProductDescriptions
                               .Where(a => a.Languages.AlternateCode.Equals("en", StringComparison.CurrentCultureIgnoreCase))
                        });

ただし、製品テーブルには約 15 個のプロパティがあり、言語部分だけでなく、結果セット用にロードする必要がある製品の他の 4 つの子テーブルもあります。これらのプロパティと子オブジェクトのすべてを手動で調べてマップする必要がないように、熱心な読み込みと投影を行う方法はありますか? 私のコードが今立っている場所は次のとおりです。

var query = inventoryRepository.ObjectSet
                    .Include("ProductDescriptions")
                    .Include("ProductAllowedWarehouses")
                    .Include("ProductToCategories")
                    .Include("PriceLevels")
                    .Include("AttachmentAssociations.Attachment").AsExpandable()
                    .Where(wherePredicate);

本当にいいです選択は必要ありません。ProductDescriptions をプロジェクションに変更したら、Select を追加すると、他のプロパティ/子が無料で入力されなくなります。

4

1 に答える 1

1

予測+積極的な読み込みについてこのブログを読みます。積極的な読み込みに関しては、問題が発生します。.Anyを使用して、サブ選択を実行することをお勧めします。

ProductDescriptionsにフィルター/場所を追加できないのはなぜですか?

 var query = inventoryRepository.ObjectSet
                .Include("ProductDescriptions")
                .Include("ProductAllowedWarehouses")
                .Include("ProductToCategories")
                .Include("PriceLevels")
                .Include("AttachmentAssociations.Attachment").AsExpandable()
                .Where(wherePredicate)
                .Where(a=>a.ProductDescriptions.Languages.AlternateCode.Equals("en", StringComparison.CurrentCultureIgnoreCase);
于 2010-07-27T19:50:55.497 に答える