使用LINQ to C#的最佳模式是什么?

What is the best pattern to use LINQ to C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class CommonService
{
    private readonly DataContext _context;

    public CommonRepository()
    {
        _context = new DataContext();
    }

    public CommonRepository(DataContext context)
    {
        _context = context;
    }

    public List GetAll()
    {
        var query = from m in _context.MyModel
                    select m;
        return m.ToList();
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
    public class CommonService
    {
        public List GetAll()
        {
            using (DataContext context = new DataContext())
            {
                var query = from m in context.MyModel
                            select m;
                return m.ToList();
            }
        }
    }

或者你有更多的图案,请建议我。


这里有一个主要的区别:第一个代码示例在服务的生命周期内保持一个单独的数据上下文,而第二个示例为每个操作旋转一个新的数据上下文。第二个例子通常是正确的,因为有了变更跟踪,DataContext会变得很大,如果有其他东西调用SubmitChanges(),您可以意外地提交不想提交的内容。

请参见Linq to SQL DataContext的多个/单个实例


您可以使用这两种模式,但一定要确保上下文的使用寿命很短。第一个选项允许您在CommonService中创建需要上下文的方法,但不必在每个方法中创建一个。所以它可以防止重复的代码。此外,它还允许IOC容器通过构造函数注入将上下文注入到CommonService中。

如果你选择第一个选项(我倾向于这样做),你可以考虑让CommonService实现IDisposable,给它一个处理上下文的aDispose方法。这也将鼓励您在using结构中使用CommonService,从而限制其寿命。