我控制了一些实体框架代码,并希望重构它。在我这样做之前,我想检查一下我的想法是否正确,并且我没有错过实体框架的做事方式。
示例1 - 子查询与加入
这里我们在As和B之间有一对多。除了下面的代码难以阅读之外,它还效率低吗?
from a in dataContext.As
where ((from b in dataContext.Bs
where b.Text.StartsWith(searchText)
select b.AId).Distinct()).Contains(a.Id)
select a
例如,使用连接并执行类似的操作会更好吗?
from a in dataContext.As
where a.Bs.Any(b => b.Text.StartsWith(searchText))
select a
示例2 - 显式联接与导航
这里我们在As和B之间有一对多,在B和C之间有一对多。
from a in dataContext.As
join b in dataContext.Bs on b.AId equals a.Id
join c in dataContext.Cs on c.BId equals b.Id
where c.SomeValue equals searchValue
select a
是否有充分的理由使用显式连接而不是浏览数据模型?例如:
from a in dataContext.As
where a.Bs.Any(b => b.Cs.Any(c => c.SomeValue == searchValue)
select a
答案 0 :(得分:0)
有时需要使用join-style和子查询来控制LINQ 2 SQL查询的某些方面。这不是这种情况。 “导航”风格是绝对可取的。有时,它甚至带来了性能优势,因为LINQ to SQL使用了更智能的SQL模式。
我不只是想回答“你是对的”所以让我说我有很多LINQ to SQL的经验。我在两个较大的项目中使用它,其中性能至关重要,几乎所有生成的SQL语句都由我进行了性能测试。因此,这个答案具有一定的权威性,并不仅仅是一个随机的互联网意见。