左Linq加入实体
问题描述:
我正在尝试使用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])'方法,并且此方法不能转换为存储表达式。“
答
首先,实体框架的版本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();
还能有每个类别中的两个默认值?如果是这样,你想要两个对象返回相同的类别? – StriplingWarrior 2011-01-18 23:47:56
另外,你使用的是什么版本的实体框架? – StriplingWarrior 2011-01-18 23:55:49