2011-01-18 82 views
1

我正在嘗試使用Linq加左加入,並失敗。我曾試圖遵循的幾個例子,並結束了與此(failinmg)LINQ查詢:左Linq加入實體

var defaultCategories = (from cats in Db.categories 
           join defaults in Db.payee_default_category on cats.category_id equals 
            defaults.category_id 
            into merged 
           from results in merged.DefaultIfEmpty() 
           select new {cats.category_id, cats.description}).ToList(); 

所以,我需要讓我的分類表中的所有項目,加入到payee_default_category上Categories.category_id = Payee_Default_Category .Category_id,並返回Category_id,Category.Description以及payee_default_category表中是否存在記錄的布爾值。

然而,(可俯瞰事實,我不顯示,如果有匹配的記錄...)在運行時,我得到一個錯誤:

「LINQ到實體無法識別方法「System.Collections中.Generic.IEnumerable 1[Data.payee_default_category] DefaultIfEmpty[payee_default_category](System.Collections.Generic.IEnumerable 1 [Data.payee_default_category])'方法,並且此方法不能轉換爲存儲表達式。「

+0

還能有每個類別中的兩個默認值?如果是這樣,你想要兩個對象返回相同的類別? – StriplingWarrior 2011-01-18 23:47:56

+0

另外,你使用的是什麼版本的實體框架? – StriplingWarrior 2011-01-18 23:55:49

回答

2

首先,實體框架的版本1中不支持DefaultIfEmpty方法,但它在版本4中受支持。您可能需要升級。

其次,既然你只是在尋找一個布爾值來確定是否有任何默認值,那麼你並沒有像「存在」那樣做一個真正的外連接,你應該能夠像這樣實現它:

var defaultCategories = 
    (from cats in Db.categories 
    let defaults = Db.payee_default_category.Where(
     d => d.category_id == cats.category_id) 
    select new {cats.category_id, cats.description, hasDefaults = defaults.Any()}) 
    .ToList(); 

而且,你的實體框架方面在理想情況下被設置了表映射,這將使更簡單查詢:

var defaultCategories = 
    (from c in Db.categories 
    select new {c.category_id, c.description, 
     hasDefaults = c.payee_default_categories.Any()}) 
    .ToList();