0

我正在學習EF和LINQ to EF。我們正在使用LINQ方法而不是LINQ表達式。實體框架使用LINQ方法通過NavigationProperty進行簡單篩選

我想從我的2個實體做一個非常簡單的查詢。

NavigationGroup與NavigationGroupLocation是一對多的關係。導航屬性,NavigationGroup被稱爲「NavigationGroupLocations」

在我看來這個代碼應工作:

List<NavigationGroup> groups = db.DataModel.NavigationGroups.Where(g => g.NavigationGroupLocations.Location == 1).ToList(); 

位置是我NavigationGroupLocation實體一個int。

有人可以解釋爲什麼這不起作用,以及通過導航屬性過濾的正確方法是什麼?我在表達式語法中看到了很多例子,似乎無法將它與方法語法聯繫起來。

我使用C#4 & EF 4.

感謝您的幫助!

編輯

我看到了,因爲我的導航屬性是一個集合,我不能得到的個人財產。所以我想這個代碼:

.Where(g => g.NavigationGroupLocations.Any(l => l.Location == 1)); 

當我嘗試運行它,我得到這個錯誤:

Cannot implicitly convert type 'System.Linq.IQueryable<ME.Data.ECom.NavigationGroup>' to 'System.Data.Objects.ObjectSet<ME.Data.ECom.NavigationGroup>'. An explicit conversion exists (are you missing a cast?) 

我應該怎麼做?

回答

0

您需要進行加入。 NavigationGroupLocations是項目列表,因此您無法在where子句中訪問.Location屬性。

+0

你如何做linq方法語法加入?你能看看我的編輯,看看我是否用正確的方向使用.Any()? – Jared 2012-04-13 18:50:23

0

它看起來像這樣工作的:

var query = db.DataModel.NavigationGroups.Where(g => g.NavigationGroupLocations.Any(l => l.Location == selectedLocation)); 

它不爲條件語句中使用時的工作。

var query = db.DataModel.NavigationGroups; 
if (selectedLocation > 0) 
{ 
    query = query.Where(g => g.NavigationGroupLocations.Any(l => l.Location == selectedLocation)); 
} 

那是當我得到錯誤。

+0

請問我爲什麼不使用LinQ表達式? – 2012-04-13 19:30:47