【发布时间】:2019-06-26 11:07:51
【问题描述】:
我在 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 db.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 然后在每个方法中使用单独的查询(Approch 1)还是应该创建一个列表并获取所有数据并在方法本身中使用在哪里条件。 (接近 2)
【问题讨论】:
-
1) 始终在数据源处进行过滤。在方法 2 中,如果你有 2000 万用户会发生什么?所有这些记录都将被提取到内存中,然后在内存中进行过滤,这对性能来说是很糟糕的。
-
@Igor 这意味着你说第一种方法比第二种方法好。
-
2) 研究使用依赖注入,它可以管理实例的生命周期,包括释放资源(在禁用类型上调用 Dispose)。然后
UserDetails类型将有一个构造函数,该构造函数采用DbContext类型并使用它。 -
第一种方法更好,因为 1)您仅通过请求实现数据 2)其他线程可能会更新 db 中的数据。使用第二种方法,您将永远无法获得此更新
-
第二种方法的另一个问题是您的记录会过时。如果某些东西更新了用户的 Active 状态,但您仍然在弄乱您拉入列表的旧状态,会发生什么情况。基本上,您希望尽可能多地提取一些记录,然后您可以实现某种类型的缓存(如有必要),您可以在其中控制在去数据库获取新数据之前将数据保留在内存中的时间。
标签: c# database performance linq