为什么这个加入不与Entity Framework v4一起使用?

时间:2010-01-23 15:29:18

标签: entity-framework

我使用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一行!

3 个答案:

答案 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实体框架   队