2011-07-01 74 views
0

我在实体框架中发现“包含”的问题。让我们假设我有两个外键关系的表。未收到包含对象的数据 - 实体框架

var result = (from u in entity.Table1.Include("Table2") 
      join o in entity.Table2 on u.Column1 equals o.Column1 
      where u.Column2 == “abc” && u.Column3 == ‘xyz’ 
      && o.Column5 == organizationCode 
      select u).FirstOrDefault(); 

对于上述查询,即使我在数据库中有适当的数据,它也不会返回结果中的Table2对象数据。

我发现上述查询的问题是,如果查询有“包括”以及“加入”,EF不考虑“包含”表。这是我的假设。

花了一些时间后,我通过在下面写了一个虚拟查询来获得数据。请参阅下面的两个查询。

var result = (from u in entity.Table1.Include("Table2") 
      join o in entity.Table2 on u.Column1 equals o.Column1 
      where u.Column2 == “abc” && u.Column3 == ‘xyz’ 
      && o.Column5 == organizationCode 
      select u).FirstOrDefault(); 


    var resultOrg = (from o in entity. Table2 
        where o.Column5 == organizationCode 
        select o).FirstOrDefault(); 

执行这两个查询后,我在结果变量中获取Include(Table2)数据。在这种情况下,我正在执行一个我想避免的查询。
请建议我在哪里做错了。

回答

0

如果您使用的是join,则不能使用Include。现在有办法。此外,你正在尝试做的是过滤包括这也是不可能的。

你可以这样做:

但是,这将包括所有Table2实体过滤Table1实体。您不能将包含的值限制为仅具有某些组织代码的值。

要过滤导航属性必须使用投影:

var result = (from u in entity.Table1 
       where u.Column2 == “abc” && u.Column3 == ‘xyz’ && 
        u.Table2.Any(o => o.Column5 == organizationCode) 
       select new 
        { 
         Table1 = u 
         Table2 = u.Table2.Where(o => o.Column5 == organizationCode)    
        }).FirstOrDefault(); 

您必须项目要么匿名类型或自定义类型。

为什么你的第二个查询工作的原因是为了跟踪性关系的自动连线,这是另一种方式如何筛选关系,但在这种情况下,这已经足够了:

var result = (from u in entity.Table1 
       where u.Column2 == “abc” && u.Column3 == ‘xyz’ && 
        u.Table2.Any(o => o.Column5 == organizationCode) 
       select u).FirstOrDefault(); 


var resultOrg = (from o in entity. Table2 
       where o.Column5 == organizationCode 
       select o).FirstOrDefault();