没有获取Include对象的数据 - 实体框架

时间:2011-07-01 12:07:32

标签: entity-framework-4 linq-to-entities

我在实体框架中遇到“包含”的问题。让我们假设我有两个具有外键关系的表。

   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)数据。在这种情况下,我不必要地执行一个我想避免的查询 请建议我在哪里做错了。

1 个答案:

答案 0 :(得分:0)

如果您使用Include,则无法使用join。现在有办法解决这个问题。此外,您要做的是过滤包括哪些也是不可能的。

你可以这样做:

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

但它会将所有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();