我想说:
我必须找到属于特定学校的所有课程(IdSchool = 2),并且这些课程来自科学。
无论如何,因为我发现LINQ非常使用我做的事情:
using(var context = new MyEntities())
{
var classesOfInterest = context.Schools
.SelectMany(x => x.Teachers)
.SelectMany(x => x.Classes)
.Where(x => /* custom criteria */ )
.ToList();
}
所以我的问题是:使用这种方法的instad是否使用了连接语句的不良做法?我应该使用JOIN语句吗?在某些情况下,我链接了5个“SelectMany”语句。现在它工作得很好,因为数据库很小。如果我在大型数据库中工作,我应该尽量避免这种情况吗?
答案 0 :(得分:3)
使用这种方法的instad是否使用了连接语句的错误做法?
完全没有。事实上,这是使用EF时推荐(或首选)的做法。所谓的导航属性是EF的优点之一。当你拥有它们(并且你拥有它们)时,你永远不需要使用“手动”连接。如果它们是对象/集合,您只需“导航”,如果您编写它们,EF会为您生成连接,但不需要记住一个表中的哪个字段连接到另一个字段中的哪个字段。
例如,让我们采用您的查询的简化版本:
var queryA = context.Schools.SelectMany(x => x.Teachers);
var sqlA = queryA.ToString();
和使用连接的等价物:
var queryB = from s in context.Schools
join t in context.Teachers on s.Id equals t.IdSchoool
select t;
var sqlB = queryB.ToString();
您会看到sqlA
和sqlB
是同一个。