数据层重构

时间:2012-12-18 10:31:45

标签: 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

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

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

1 个答案:

答案 0 :(得分:0)

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

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