代码之家  ›  专栏  ›  技术社区  ›  Felipe Pessoto

为什么这个连接不能与实体框架v4一起工作?

  •  2
  • Felipe Pessoto  · 技术社区  · 15 年前

    我用 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;
    

    实体框架v4似乎不能很好地与对象初始值设定项一起工作?

    目前的解决方案是:

    var result = from person in context.People.Include("Cars").Include("Houses")
                 select person;
    

    但表演太荒谬了,我要带豪斯排!

    3 回复  |  直到 15 年前
        1
  •  0
  •   itchi    15 年前

    黑暗中的一枪……

    做:

    var results = from person in context.Person
                  let count = person.Houses.Count()
                  select new {person, count };
    

    工作?不过,老实说,我认为您的第一个查询应该有效。

        2
  •  0
  •   Craig Stuntz    15 年前
    var result = from person in context.People.Include("Cars")
                 select new {  
                     Person = person, 
                     Cars = person.Cars,
                     HouseCount = person.Houses.Count()
                 };
    

    当然是多余的,但是人。现在汽车会被填充。

        3
  •  0
  •   Felipe Fujiy Pessoto    15 年前

    http://connect.microsoft.com/VisualStudio/feedback/details/527749/join-bug-at-ef4-code-only

    你好,菲利佩,

    当include应用于查询时,它 注入附加__查询范围__ 查询的信息,即 稍后在查询 实际执行。查询广度 信息用于内部 重写查询,使实体 可以通过 指定的导航属性为 也来自数据库和 物化。

    当应用其他查询运算符时 在包含之后,我们试图保存这个 查询跨度信息。然而, 中指定的查询范围信息 include不会在查询上流动 更改结果类型的运算符 查询的。

    例如,在这样的查询中: VaR结果= 来自上下文中的人。人。包括(“汽车”)。 选择New Person、Person.Houses.Count、Bar、Foo等

    结果类型正在更改,原因是 投影操作(选择) 结束和最终结果类型 查询不再是原始查询 包含的实体类型为 应用,因此查询范围信息 迷路了。一个共同的建议 避免这是要始终应用include 最后:

    var result = 
        from person in context.People
        select new { person, person.Houses.Count, bar, foo, etc };
    var resultWithCars =
        result.Include("Cars");
    

    在这种情况下,结果是 包含将引发异常 在运行时(相对于失败 因为查询范围不能 真正适用于匿名 类型。

    上述所有行为均由 设计,但因为这是不可能的 以便include在中引发异常 很多情况下,我们发现这是 混淆的共同来源 客户。

    如果要对 像这样的匿名类型,你想要 为了获得汽车财产,有 其实很简单。简单地 将Cars属性包括在 投影,如下所示:

    var result = 
        from person in context.People
        select new { person, person.Cars, person.Houses.Count, bar,
    

    FO等;

    我们目前正在考虑 对查询范围API的改进 可能解决的未来版本 像这样的问题,所以你的反馈是 非常感谢。但既然我们不是 当前的计划改进 释放并保持未来 改善内部积压工作, 我将继续解决当前问题 工作项。

    谢谢,Diego Vega实体框架 团队