我们在ASP.NET Core解决方案中使用SQL数据库来存储事物,也可以为每件事物存储零到多个项目类型。我们还为存储的每种项目类型存储数量。我需要能够对项目类型的数量求和,并将其返回到视图。
下面是我们在控制器中使用的内容:
IQueryable<Item> items = _context.Items
.Include(ep=>ep.ItemType)
.Include(ep=>ep.ItemActionType)
.Include(ep=>ep.Thing)
.AsQueryable();
我们在控制器中使用的用于获取总和的查询是:
int itemsum = (int)items.Where(ep => ep.ItemTypeId == 2 && ep.ItemActionTypeId == 8).Select(ep => ep.ItemQuantity).Sum();
数据库具有以下条目,这些条目应导致返回的总和为6:
Id ThingId ItemTypeId ItemActionTypeId ItemQuantity
1 100 2 8 2
2 100 2 8 1
3 103 2 8 1
4 103 2 8 1
5 105 2 8 1
此信息返回值3。
我做错了什么?
解决方案:
我不知道为什么,但是从搜索模型中添加一个日期范围允许我们对IQueryable进行求和运算。至少,在我看来是这样的。下面是我们添加的使它工作的代码。我们将它放在IQueryable之后,但在求和运算之前。
items = items.Where(e => e.Thing.ThingDateTime >= searchThings.FromDateTime
&& e.Thing.ThingDateTime <= searchThings.ToDateTime);
``
3条答案
按热度按时间nfs0ujit1#
这可能是转换到SQL和具体化查询时出现的问题。您也可能有代码在某处对IQueryable应用了额外的过滤器,这将修改结果,因为IQueryable结果不从服务器获取数据,并且在通过ToList()、Sum()等从服务器触发结果之前应用了额外的过滤器(例如Where子句),这将改变查询。
首先,尝试运行下面的示例代码,看看是否得到了所需的结果,然后用DbContext交换示例数据上下文,以确定是否
m4pnthwp2#
您可以将其作为List获取
ruarlubt3#
解决方案:
我不知道为什么,但是从搜索模型中添加一个日期范围允许我们对IQueryable进行求和运算。至少,在我看来是这样的。下面是我们添加的使它工作的代码。我们将它放在IQueryable之后,但在求和运算之前。