EF核心数据分组和分页

时间:2020-04-15 14:00:19

标签: .net entity-framework .net-core entity-framework-core

我有一些需要分组的数据,但是如果groupId为'0',则不必分组。我将其视为单个数据。以下是示例数据

DECLARE @ProductTable TABLE
(
  ProductId INT,
  ProductName NVARCHAR(100),
  Price decimal(10,2),
  GroupId NVARCHAR(10)
)

INSERT INTO @ProductTable (ProductId, ProductName, Price, GroupId) VALUES (1, 'Item1', 100, '0')
INSERT INTO @ProductTable (ProductId, ProductName, Price, GroupId) VALUES (2, 'Item2', 100, '0')
INSERT INTO @ProductTable (ProductId, ProductName, Price, GroupId) VALUES (3, 'Item3', 100, '0')
INSERT INTO @ProductTable (ProductId, ProductName, Price, GroupId) VALUES (4, 'Item4', 100, 'G1')
INSERT INTO @ProductTable (ProductId, ProductName, Price, GroupId) VALUES (5, 'Item5', 100, 'G1')
INSERT INTO @ProductTable (ProductId, ProductName, Price, GroupId) VALUES (6, 'Item6', 100, 'G2')
INSERT INTO @ProductTable (ProductId, ProductName, Price, GroupId) VALUES (7, 'Item7', 100, 'G3')
INSERT INTO @ProductTable (ProductId, ProductName, Price, GroupId) VALUES (8, 'Item8', 100, 'G3')
INSERT INTO @ProductTable (ProductId, ProductName, Price, GroupId) VALUES (9, 'Item9', 100, 'G3')
INSERT INTO @ProductTable (ProductId, ProductName, Price, GroupId) VALUES (10, 'Item10', 100, 'G3')

我可以通过将其分开来实现分组,例如。

var singleProducts = _context.ProductTable.Where(p => p.GroupId = '0').ToList();
var groupedProducts = _context.ProductTable.Where(p => p.GroupId != '0').GroupBy(g => g.GroupId).ToList();

并加入他们。

var data = singleProducts.Select(s => new ResultData(){
    ProductId = s.ProductId,
    ProductName = s.ProductName,
    Count = s.Count(),
    Total = s.Sum(ss => ss.Price)
}).ToList();

var data2 = groupedProducts .Select(s => new ResultData(){
    ProductId = s.First().ProductId,
    ProductName = s.First().ProductName,
    Count = s.Count(),
    Total = s.Sum(ss => ss.Price)
}).ToList();

var mergeData = new List<ResultData>();
mergeData.AddRange(data);
mergeData.AddRange(data2);

实现此结果

ProductId, ProductName, Count, Total
1           Item1        1       100
2           Item2        1       100
3           Item3        1       100
4           Item4        1       200
6           Item6        1       100
7           Item7        1       400

有可能在1个LINQ或Lambda表达式中实现吗?因为此数据需要分页。 我像上面一样分别称呼它们,大约需要20-30秒才能完成,因为这些数据非常庞大,例如200k-300k

0 个答案:

没有答案