2017-02-09 69 views
0

我是一個實體框架(實際版本6)新手,並嘗試做一些查詢。帶有2個連接的.NET實體框架查詢

我的數據庫看起來類同此:

enter image description here

我嘗試了查詢(這是不正確的),如:

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")) 

其中AsExpandable()是從LinqKit的功能。

這就是我想在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' 

,這樣我可以在我的視圖中顯示狀態說明:

@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中的更改視角必要?

回答

0

您的問題是不支持過濾Include。我認爲在這種情況下,最簡單的方法是首先加載Product s和Status,然後再加載翻譯。我會告訴你如何做到這一點在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 

兩個LINQ查詢所需的數據加載到上下文。 EF通過關係修正填充導航屬性,因此您實際上可以找到item.Status.StatusTranslations.FirstOrDefault()

一件重要的事情:你必須先禁用延遲加載:

db.Configuration.LazyLoadingEnabled = false; 

這是因爲導航性能,即使它們被填充,沒有標記爲加載。否則解決它們會導致延遲加載。