gpt4 book ai didi

c# - 如何从 dotnet 核心 Entity Framework 中的多个表中分组数据

转载 作者:行者123 更新时间:2023-12-04 13:36:50 25 4
gpt4 key购买 nike

我正在构建一些市场网络应用程序,比如 e-bay。典型场景是:

用户提出由一个或多个项目组成的报价,这些项目属于某种类型。之后其他用户对该报价进行投标。

这里是简化图。

diagram

在 SQL Fiddle ( here ) 上,您可以看到 CREATE TABLE 和 INSERT INTO 语句

样本数据:
有两种优惠。在一个报价(Id 1)上,它包含一个“ watch ”类型的项目。还有另一个优惠 (Id 2),其中包含一个“耳机”类型的商品。
两个报价都有出价。在 watch 上,有两个 bis;一个出价 100 美元,另一个出价 120 美元。在耳机上,有 50 美元和 80 美元的出价。

我想要实现的是每种类型的平均出价。在此示例中,这意味着我希望获得 110 作为 watch 的平均出价和 65 作为耳机的平均出价。为了使用 T-SQL 实现这一点,我会编写这样的查询:

SELECT t.name,
avg(amount)
FROM bid b
LEFT JOIN offer o ON b.OfferId = o.id
LEFT JOIN offeritem oi ON o.id = oi.OfferId
LEFT JOIN itemType t ON oi.itemtypeid = t.Id
GROUP BY t.name

所以,我的问题是 - 如何在 dotnet core 3.0 EntityFramework 中实现这一点

使用 GroupBy,像这样:
_context.Bids
.Include(b => b.Offer)
.ThenInclude(o => o.OfferItems)
.ThenInclude(os => os.ItemType)
.GroupBy(b => b.Offer.OfferItems.First().ItemType.Name);

给出异常(exception):

Client side GroupBy is not supported.



.当我尝试投影时,像这样:
_context.Bids
.Include(b => b.Offer)
.ThenInclude(o => o.OfferItems)
.ThenInclude(os => os.ItemType)
.GroupBy(b => b.Offer.OfferItems.First().ItemType.Name)
.Select(g => new
{
Key = g,
Value = g.Average(b => b.Amount)
});

我再次遇到异常。

Processing of the LINQ .... failed. This may indicate either a bug or a limitation in EF Core.



编辑:

这种方法
_context.Bids
.Include(b => b.Offer)
.ThenInclude(o => o.OfferItems)
.ThenInclude(os => os.ItemType)
.GroupBy(b => new { b.Offer.OfferItems.First().ItemType.Name}, b => b.Amount)
.Select(g => new
{
Key = g.Key.Code,
Value = g.Average()
});

也抛出了异常,但这一次:

Cannot use an aggregate or a subquery in an expression used for the group by list of a GROUP BY clause.



...

那么,有没有办法对数据进行分组(获得简单的平均值),或者我应该进行另一个查询并迭代整个集合并自己进行计算?那肯定会降低性能(我希望我可以进行服务器分组,但正如你所看到的,我遇到了提到的问题)。有任何想法吗?提前致谢。

最佳答案

在您的情况下,很难从分组中隐藏子查询

你可以这样试试

var joined =
context.Bid
.SelectMany(x =>
x.Offer.OfferItem
.Select(y => new
{
Amount = x.Amount,
Name = y.ItemType.Name
})
.Take(1));

var grouped = from i in joined
group i by i.Name into groups
select new
{
Key = groups.Key,
Amount = groups.Average(x => x.Amount)
};

它给了我一个查询
SELECT [t].[Name] AS [Key], AVG([t].[Amount]) AS [Amount]
FROM [Bid] AS [b]
INNER JOIN [Offer] AS [o] ON [b].[OfferId] = [o].[Id]
CROSS APPLY (
SELECT TOP(1) [b].[Amount], [i].[Name], [o0].[Id], [i].[Id] AS [Id0], [o0].[OfferId]
FROM [OfferItem] AS [o0]
INNER JOIN [ItemType] AS [i] ON [o0].[ItemTypeId] = [i].[Id]
WHERE [o].[Id] = [o0].[OfferId]
) AS [t]
GROUP BY [t].[Name]

关于c# - 如何从 dotnet 核心 Entity Framework 中的多个表中分组数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61319311/

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