我已经控制了一些实体框架代码,并希望对其进行重构。在此之前,我想检查一下我的想法是否正确,并且我并没有错过实体框架的做事方式。
示例 1 - 子查询与联接
在这里,我们在 As 和 Bs 之间存在一对多。除了下面的代码难以阅读之外,它是否也效率低下?
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 和 Bs 之间存在一对多,在 Bs 和 Cs 之间存在一对多。
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