Entity framework 4 未获取包含对象--实体框架的数据

Entity framework 4 未获取包含对象--实体框架的数据,entity-framework-4,linq-to-entities,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

我发现实体框架中的“包含”有问题。假设有两个表具有外键关系

   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对象数据,即使数据库中有正确的数据

我在上面的查询中发现的问题是,如果查询有“Include”和“Join”,EF就不会考虑“Include”表。这是我的假设

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

  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(表2)数据。在这种情况下,我不必要地执行一个我希望避免的查询。

请告诉我我们哪里做错了

如果使用的是
join
,则不能使用
Include
。现在有办法解决这个问题。此外,您试图做的是过滤include,这也是不可能的

您可以这样做:

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();