【问题标题】:Entity Framework Include With Where With 3 Tables实体框架包括 Where 和 3 个表
【发布时间】:2009-10-02 20:24:19
【问题描述】:

我试图从一个基表中包含两个表,并在第二个表上提供“where”语句,但我遇到了一个非常令人困惑的错误(如下)。对问题/解决方案有任何想法吗?

ObjectQuery<STATE> productQuery = 
    LeadsContext.STATE.Include("REGION")
      .Where("it.REGION.BRAND.BRAND_ID = @brand", new ObjectParameter("brand", brand))
      .OrderBy("it.STATE_ABBV");

基本表格布局:STATE ------ REGION ------ BRAND

BRAND_ID 在 BRAND 中

“BRAND”不是“Transient.collection[Citizens.Leads.Data.REGION(Nullable=True,DefaultValue=)]”的成员。 要从集合中提取属性,您必须使用子查询 到 遍历集合。,多部分标识符附近,第 8 行,列 1.

【问题讨论】:

    标签: .net entity-framework


    【解决方案1】:

    听起来State.REGION 实际上是Region 实体的集合。

    在这种情况下,您不能像那样直接访问 BRAND 导航,因为您的语句尝试访问集合的 BRAND 属性,而不是集合中元素的 BRAND 属性。

    如果您使用 LINQ to Entities 而不是查询构建器方法编写此查询,您可以这样做:

    var productQuery = from s in LeadsContext.State
                       from r in s.REGION
                       where r.Brand.Brand_ID == brand
                       orderby s.STATE_ABBR
                       select s;
    

    当然这不会急切地加载 REGION(s),所以你可能认为你可以这样写:

    var productQuery = from s in LeadsContext.State.Include("REGION")
                       from r in s.REGION
                       where r.Brand.Brand_ID == brand
                       orderby s.STATE_ABBR
                       select s;
    

    但这不会起作用,因为当您执行 Select Many(即from y in z from x in y)时,您的 INCLUDE 会丢失。

    所以你必须像这样在结尾处包含:

    var productQuery = (from s in LeadsContext.State
                       from r in s.REGION
                       where r.Brand.Brand_ID == brand
                       orderby s.STATE_ABBR
                       select s) as ObjectQuery<State>).Include("REGION");
    

    有关此解决方法的更多信息,请参阅 tip 22

    我不能 100% 确定我们的查询构建器方法,即 Where(string),是否支持所需的子选择。

    所以我不确定那里的语法是什么。

    无论如何我希望这会有所帮助

    亚历克斯

    【讨论】:

    • 如果有人拥有适用于此处第一个 LINQ 查询的查询生成器语法,那将非常有帮助。我只是想感受一下两者之间的区别。
    【解决方案2】:

    Alex,您可以通过以不同的方式处理查询,从而在查询生成器中实现类似的效果。查询生成器支持存在。查询将如下所示:

    对象查询 productQuery = LeadsContext.STATE.Include("地区") .Where("EXISTS(SELECT 1 FROM it.REGION.BRAND as b WHERE b.BRAND_ID = @brand)", new ObjectParameter("brand", brand)) .OrderBy("it.STATE_ABBV");

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多