gpt4 book ai didi

c# - 如何使用 Entity Framework 和存储库模式获取记录数

转载 作者:行者123 更新时间:2023-11-30 23:16:32 26 4
gpt4 key购买 nike

我们使用 Entity Framework 和存储库模式在 MVC 中开发了一个应用程序。当用户登录时,他们会看到一个仪表板,其中包含根据其状态进行的多次轮类计数。见下文:

enter image description here

在 Controller 中,我们使用以下行填充 ViewModel:

viewModel.shiftsInProgress = _shiftDateService.GetShiftDatesByStatusID(72).Count();

这链接到以下方法:

 public IList<ShiftDate> GetShiftDatesByStatusID(int statusID)
{
return _UoW.ShiftDates.Get(s => s.shiftDateStatusID == statusID)
.OrderByDescending(s => s.shiftID).ToList();
}

此方法还用于在另一个 View 中按状态拉出类次列表。

我们的工作单元 (_UOW) 映射到包含 2 个获取方法的通用存储库:

 public IList<TEntity> Get(Expression<Func<TEntity, bool>> filter = null,Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,string includeProperties = "")
{
IQueryable<TEntity> query = dbSet;

if (filter != null)
{
query = query.Where(filter);
}

foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}

if (orderBy != null)
{
return orderBy(query).ToList();
}
else
{
return query.ToList();
}
}

public IEnumerable<TEntity> GetWithRawSql(string query, params object[] parameters)
{
return dbSet.SqlQuery(query, parameters).ToList();
}

我正在寻找一些关于这是否是最佳实践的建议,仪表板上正在提取计数的查询开始减慢应用程序的速度。我认为这是因为我们正在为仪表板上的每个计数拉回一个 ilist,然后在 Controller 中为每个计数使用 Count() 方法。

我应该执行以下操作吗?

  1. 向通用存储库添加另一个方法,IEnumerable GetAll(); - 然后用它来计算记录数。

  2. 使用“GetWithRawSql”方法,然后使用 SQL 获取计数。

  3. 还有别的吗?如下所示:

我是否最好删除“已完成类次”计数,然后将所有未完成类次的 IList 返回给 Controller 。然后在 Controller 内部使用 linq 按状态查询并使用 count() 方法。即

ilist<shiftdate> allIncompleteShifts = _shiftService.GetIncompleteShifts.ToList();

ViewModel.InProgress = allIncompleteShifts.Where(s => s.status ==72).Count();
ViewModel.Submitted = allIncompleteShifts.Where(s => s.status ==73).Count();

这将如何影响性能

最佳答案

这里有几个选项。一种常用的方法是返回 IQueryable<TEntity>。从您的存储库而不是返回 IList<TEntity> .

使用这种方法,查询是在数据库上执行的,而不是在内存中执行的。这包括过滤、排序等。还有 Count()将被翻译成相应的 SQL 并在数据库上执行。

另一种方法是创建一个不太通用的存储库,其中还包含特定查询。

有一个讨论你是否应该公开一个 IQueryable<TEntity> in this question .结论是:这取决于您是否想通过 IQueryable<TEntity> 为存储库的用户提供更多灵 active 。 .然后您必须记住,用户现在可以执行您可能不希望执行的查询。您可以在给定的链接中找到更多详细信息。

关于c# - 如何使用 Entity Framework 和存储库模式获取记录数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41955528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com