5

我已经控制了一些实体框架代码,并希望对其进行重构。在此之前,我想检查一下我的想法是否正确,并且我并没有错过实体框架的做事方式。

示例 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
4

1 回答 1

0

有时需要使用连接样式和子查询来控制 LINQ 2 SQL 查询的某些方面。这不是这里的情况。“导航”风格是绝对可取的。有时,它甚至会带来性能优势,因为 LINQ to SQL 使用了更智能的 SQL 模式。

我不只是想用“你是对的”来回答,所以让我说我对 LINQ to SQL 有很多经验。我在两个较大的项目中使用它,其中性能至关重要,几乎每个生成的 SQL 语句都经过我的性能测试。因此,这个答案具有一定的权威性,而不仅仅是随机的互联网观点。

于 2012-12-18T11:02:12.227 回答