实体框架为同一实体

时间:2018-01-10 08:34:49

标签: c# .net oracle entity-framework

我有以下型号。

public class Table1
{
     public int Id {get; set;}
     public string Table1Property {get; set;}
     public int? Table2Id {get; set;}
     public virtual Table2 Table2 {get; set;}
}

public class Table2
{
     public int Id {get; set;}
     public string Table2Property {get; set;}
     public virtual ICollection<Table1> Table1 {get; set;}
     public int? Table3Id {get; set;}
     public virtual Table3 Table3 {get; set;}
}

public class Table3 
{
     public int Id {get; set;}
     public virtual ICollection<Table2> Table2 {get; set;}
}

这些模型是由Entity Framework首先使用数据库制作的,我总是需要加载所有这些模型。虽然我启用了延迟加载,但是当可以使用联接时,我不想要三个查询。

如果我使用Table1中的元素进行搜索,那么一切都很好,它的表现就像它应该的那样。

 _dbContext.Table1.Include(x => x.Table2.Table3).Where(x => x.Table1Property == "some string").ToList();

这会产生以下查询。

SELECT ....
FFOM Table1 t1
LEFT OUTER JOIN Table2 t2 on t1.Table2Id = t2.Id
LEFT OUTER JOIN Table3 t3 on t2.Table3Id = t3.Id
WHERE t1.Table1Property = 'some string'

但是,如果我想用Table1和Table2中的元素进行搜索,那就太奇怪了。

_dbContext.Table1.Include(x => x.Table2.Table3).Where(x => x.Table1Property == "some string" && x.Table2.Table2Property == "some other string").ToList();

这会生成此查询:

SELECT ....
FROM Table1 t1
INNER JOIN Table2 t2 on t1.Table2Id = t2.Id 
LEFT OUTER JOIN Table2 t3 on t2.Id = t3.Id
LEFT OUTER JOIN Table3 t4 on t3.Table3Id = t4.Id
WHERE t1.Table1Property = 'some string'
AND t2.Table2Property = 'some other string'

所以它执行两个连接。条件的INNER JOIN和具有相同表的OUTER JOIN只是为了加载Table3。

即使我使用以下语法

_dbContext.Table2.Where(x => x.Table2Property == "some string").SelectMany(x => x.Table1).Include(x => x.Table2.Table3).Where(x => x.Table1Property == "some other string").ToList();

我收到此查询

SELECT ....
FROM Table2 t1
INNER JOIN Table1 t2 on t1.Table2Id = t2.Id 
LEFT OUTER JOIN Table2 t3 on t1.Id = t3.Id
LEFT OUTER JOIN Table3 t4 on t3.Table3Id = t4.Id
WHERE t1.Table2Property = 'some string'
AND t2.Table1Property = 'some other string'

我如何设法&#34;说服&#34;实体框架不执行OUTER JOIN并使用INNER JOIN来获取Table3?

我使用以下程序集:

  • EntityFramework v.6.3.1
  • Oracle.ManagedDataAccess v12.2.1
  • Oracle.ManagedDataAccess.EntityFramework v12.2.1

0 个答案:

没有答案