我有以下型号。
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?
我使用以下程序集: