实体框架包含3个表的位置

时间:2009-10-02 20:24:19

标签: .net entity-framework

我正在尝试从一个基表中包含两个表,并在第二个表上提供“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。

2 个答案:

答案 0 :(得分:6)

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

在这种情况下,你不能直接访问BRAND导航,因为你的语句试图访问Collection的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;

但这不起作用,因为当你选择多个(即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(字符串),支持子选择哪个是必需的。

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

无论如何,我希望这有帮助

亚历

答案 1 :(得分:6)

Alex,您可以通过不同地处理查询来在查询构建器中实现类似的功能。查询构建器支持存在。查询将如下所示:

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