2011-01-18 79 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();