2017-02-09 11 views
0

私はエンティティフレームワーク(実際のバージョン6)初心者です。いくつかのクエリを実行しようとしています。2つの結合を持つ.NET Entity Frameworkクエリ

AsExpandableは() LinqKitから関数である
Dim products = db.Product.Include(Function(p) p.Status).Include(Function(p) p.Status.StatusTranslations).AsExpandable().Where(predicate).Where(Function(p) p.Status.StatusTranslations.Language.Equals("en-Us")) 

:私はのように(正しくない)クエリを試してみました

enter image description here

私のデータベースには、これに似見えます。

これは私がSQLで何をしたいです:

Select *, st.StatusDescription from Product As p 
Join Status As s On p.StatusId = s.Id 
Join StatusTranslations As st on s.Id = st.StatusId 
Where (...predicate...) And st.Language = 'en-US' 

私は私の見解でStatusDescriptionを表示できるように:私の見解では

@ModelType IEnumerable(Of Product) 
... 
@For Each item In Model 
    @Html.DisplayFor(Function(modelItem) item.Status.StatusTranslations.StatusDescription) 
Next 

私はエラーが表示されます。

StatusDescription is not a member of ICollection(Of StatusTranslations)

問題は、これを達成するためにvb.netクエリがどのように見えるはずであり、データベーススキーマおよび/またはoの変更ですrビューが必要ですか?

答えて

0

フィルタリングされた問題は、Includeはサポートされていません。私はこの場合、最も簡単なのはProductStatusをまずロードしてから翻訳をロードすることです。私はC#でそれを行う方法を紹介します:あなたのビューで今すぐ

var products = db.Products.Include(p => p.Status) 
        .AsExpandable() 
        .Where(predicate); 
var translations = products 
        .Select(p => p.Status.StatusTranslations 
           .FirstOrDefault(tran => tran.Language == "en-Us")) 
        .Load(); 

、あなたが行うことができます:

@For Each item In Model 
    @Html.DisplayFor(Function(modelItem) item.Status.StatusTranslations 
              .FirstOrDefault().StatusDescription) 
Next 

2つのLINQクエリは、コンテキストに必要なデータをロードします。 EFはリレーションシップフィックスアップによってナビゲーションプロパティを設定しますので、実際にitem.Status.StatusTranslations.FirstOrDefault()が見つかります。

一つ重要なこと:あなたが最初に遅延読み込みを無効にする必要があります。

db.Configuration.LazyLoadingEnabled = false; 

これは、それらが移入されていても、理由はナビゲーションプロパティでは、ロードされたとしてマークされていません。それらのアドレスを指定すると、遅延ロードが引き続き発生します。

関連する問題