我正在尝试使用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])'方法,并且此方法无法转换为商店表达式。”
答案 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();