linq 从IQueryable获取整数的和

k3fezbri  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(173)

我们在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);
``
nfs0ujit

nfs0ujit1#

这可能是转换到SQL和具体化查询时出现的问题。您也可能有代码在某处对IQueryable应用了额外的过滤器,这将修改结果,因为IQueryable结果不从服务器获取数据,并且在通过ToList()、Sum()等从服务器触发结果之前应用了额外的过滤器(例如Where子句),这将改变查询。
首先,尝试运行下面的示例代码,看看是否得到了所需的结果,然后用DbContext交换示例数据上下文,以确定是否

//Sample data
var _context = new List<(int id, int ItemTypeId, int ItemActionTypeId, int ItemQuantity)>()
    {(1, 2, 8, 2),
    (2, 2, 8, 1),
    (3, 2, 8, 1),
    (4, 2, 8, 1),
    (5, 2, 8, 1)}
    .AsQueryable();

var itemSum = _context
    .Where(ep => ep.ItemTypeId == 2 && ep.ItemActionTypeId == 8)
    .Select(ep => ep.ItemQuantity)
    .DefaultIfEmpty(0)  //good practice to avoid exceptions
    .Sum();

Console.WriteLine(itemSum);
//result = 6

//If your entity has navigation properties try excluding them w/select prior to .Sum()
var itemSum = _context
    .Select(ep => ep.ItemQuantity)
    .DefaultIfEmpty(0)  //good practice to avoid exceptions
    .Sum();
m4pnthwp

m4pnthwp2#

您可以将其作为List获取

List<item> result = _context.Items
    .GroupBy(l => l.ItemType)
    .Select(cl => new item
            {
                ItemType = cl.ItemType,
                ItemActionType = cl.ItemActionType,
                Thing = cl.Thing,
                TotalQty = cl.Sum(c => c.ItemQuantity).ToString(),
            }).ToList();
ruarlubt

ruarlubt3#

解决方案:
我不知道为什么,但是从搜索模型中添加一个日期范围允许我们对IQueryable进行求和运算。至少,在我看来是这样的。下面是我们添加的使它工作的代码。我们将它放在IQueryable之后,但在求和运算之前。

items = items.Where(e => e.Thing.ThingDateTime >= searchThings.FromDateTime
                 && e.Thing.ThingDateTime <= searchThings.ToDateTime);

相关问题