左加入Linq到实体

时间:2011-01-18 23:30:56

标签: linq linq-to-entities left-join

我正在尝试使用Linq进行左连接,并且失败了。我试着遵循一些例子,最后得到了这个(failinmg)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();

所以,我需要在Categories表中获取所有项目,加入到Categories.category_id = Payee_Default_Category.Category_id上的payee_default_category,并返回Category_id,Category.Description和布尔值,如果有记录的话payee_default_category表。

然而,(忽略了我没有显示是否有匹配的记录......)在运行时,我收到一个错误:

“LINQ to Entities无法识别方法'System.Collections.Generic.IEnumerable 1[Data.payee_default_category] DefaultIfEmpty[payee_default_category](System.Collections.Generic.IEnumerable 1 [Data.payee_default_category])'方法,并且此方法无法转换为商店表达式。”

1 个答案:

答案 0 :(得分:2)

首先,Entity Framework的版本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();