我使用Entity Framework v4(仅限代码)。如果我做
var result = from person in context.People.Include("Cars")
select new { person, person.Houses.Count, bar, foo, etc };
然后result.First().Cars
为空。如果我这样做,它可以工作,但我需要Houses.Count
:
var result = from person in context.People.Include("Cars")
select person;
似乎Entity Framework v4不适用于对象初始化器吗?
现在的解决方案是:
var result = from person in context.People.Include("Cars").Include("Houses")
select person;
但表现很荒谬,我需要带上House一行!
答案 0 :(得分:0)
在黑暗中拍摄..
的作用:
var results = from person in context.Person
let count = person.Houses.Count()
select new {person, count };
工作?老实说,我认为你的第一个查询应该有效。
答案 1 :(得分:0)
var result = from person in context.People.Include("Cars")
select new {
Person = person,
Cars = person.Cars,
HouseCount = person.Houses.Count()
};
冗余,当然,但现在将填充Person.Cars。
答案 2 :(得分:0)
http://connect.microsoft.com/VisualStudio/feedback/details/527749/join-bug-at-ef4-code-only
你好Felipe,
当Include应用于查询时,它 注入额外的“查询范围” 然后是查询的信息 稍后使用,当查询是 实际执行。查询范围 信息用于内部 重写查询以便实体 这可以通过 指定的导航属性 也来自数据库和 物化。
应用其他查询运算符时 在Include之后,我们会尝试保留它 查询范围信息。然而 查询中指定的范围信息 包含不会流过查询 更改结果类型的运算符 的查询。
例如,在这样的查询中: var result = 来自上下文。人。包括(“汽车”) 选择新的{person,person.Houses.Count,bar,foo等};
结果类型因为而改变 投影操作(选择)at 结束和最终结果类型 查询不再是原始查询 Include所在的实体类型 应用,所以查询范围信息 迷路了。一个共同的建议 避免这种情况总是适用于Include 最后:
var result = from person in context.People select new { person, person.Houses.Count, bar, foo, etc }; var resultWithCars = result.Include("Cars");
在这种情况下,结果是 Include将抛出异常 在运行时(而不是失败 默默地)因为查询范围不能 真的适用于匿名 类型。
上述所有行为都是通过 设计,但因为它是不可能的 for Include抛出异常 很多情况下,我们发现这是一个 混淆的常见根源 客户。
如果你想投射到 像这样的匿名类型,你想要的 获得汽车财产,有 其实很简单。只是 包括汽车中的汽车财产 投影,像这样:
var result = from person in context.People select new { person, person.Cars, person.Houses.Count, bar,
foo,etc};
我们正在考虑一些 对查询范围API的改进 可能解决的未来版本 像这样的问题,所以你的反馈是 非常感激。但既然我们不是 规划当前的改进 释放,我们保持未来 内部积压的改进, 我将继续解决当前问题 工作项目。
谢谢,Diego Vega实体框架 队