LINQ中哪种方法更好?

时间:2019-06-26 11:07:51

标签: c# database performance linq

我在C#中使用linq,我有一个快速的问题。

我在这里展示了非常少量的代码,实时地还有一些排序操作。我想从下面知道我应该使用哪种方法?

方法1

 public class UserDetails
    {
        private dbContext db = new dbContext();
        public List<User> ActiveUser()
        {
          return db.Users.Where(m => m.Active == true).ToList();                   
        }
        public List<User> InActiveUser()
        {
          return db.Users.Where(m => m.Active == false).ToList();                   
        }

    }

方法2

 public class UserDetails
    {
       List<Defect> allUser = new dbContext().Users.ToList();
        public List<User> ActiveUser()
        {
          return allUser.Where(m => m.Active == true).ToList();                   
        }
        public List<User> InActiveUser()
        {
          return allUser.Where(m => m.Active == false).ToList();                   
        }

    }

有20多种方法正在提取数据,每种方法都是从具有不同where条件的同一张表中提取数据。 我的问题是我应该创建dbContext,然后在每种方法中使用单独的查询( 方法1 ),还是我应该创建一个List并获取所有数据,并使用方法本身对它进行过滤在哪里条件。 ( 方法2

3 个答案:

答案 0 :(得分:5)

这取决于具体情况。通常,我更喜欢方法1,因为您通常无法预测数据库中有多少用户,并且会将所有用户拉到内存中,这会导致很大的内存开销。同样,对于大量用户,您将利用索引和查询执行计划之类的数据库优化功能。

如果我们谈论的是少量用户,则由于减少了数据库往返次数,方法2可能是性能更高的方法。但是除了内存开销外,还存在其他问题,例如缓存用户和丢失数据库更新。

但是,我几乎总是喜欢使用方法1,因为对数据库进行大多数筛选和排序工作是一种很好的做法,因为它已针对此类事情进行了优化。使用方法2时,随着用户群的增长,您可能会遇到麻烦,并且很难跟踪缓存或内存问题。另外,如果您没有真正不良的连接或进行了多次连接,则一次和两次数据库往返之间的差异几乎可以忽略不计。

答案 1 :(得分:2)

切勿加载不必要的数据。在方法2中,您加载了不必要的数据量。

答案 2 :(得分:0)

我个人采用第一种方法,因为在第一种方法中,从数据库中获取已过滤的数据,而在第二种方法中,则获取所有数据,然后在框架级别而不是数据库级别进行过滤,因此在第一种方法中,可以获得性能上的好处。