数据层重构

Joe*_*oey 5 c# entity-framework

我控制了一些实体框架代码,并希望重构它.在我这样做之前,我想检查一下我的想法是否正确,我不会错过实体框架的做事方式.

示例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
Run Code Online (Sandbox Code Playgroud)

例如,使用联接并执行类似的操作会更好吗?

from a in dataContext.As
where a.Bs.Any(b => b.Text.StartsWith(searchText))
select a
Run Code Online (Sandbox Code Playgroud)

示例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
Run Code Online (Sandbox Code Playgroud)

是否有充分的理由使用显式连接而不是浏览数据模型?例如:

from a in dataContext.As
where a.Bs.Any(b => b.Cs.Any(c => c.SomeValue == searchValue)
select a
Run Code Online (Sandbox Code Playgroud)

usr*_*usr 0

有时需要使用联接样式和子查询来控制 LINQ 2 SQL 查询的某些方面。这里的情况并非如此。“导航”风格是严格优选的。有时,它甚至会带来性能优势,因为 LINQ to SQL 使用更智能的 SQL 模式。

我不想只是回答“你是对的”,所以我想说我在 LINQ to SQL 方面拥有丰富的经验。我在两个较大的项目中使用它,其中性能至关重要,几乎每个生成的 SQL 语句都经过我的性能测试。所以这个答案具有一定的权威性,并非网络上的随意观点。