以下是实体和视图模型:

public class Journal
{
    public int Id { get; set; }
    public DateTime Date { get; set; }
    public int ProductId { get; set; }
    public string SKU { get; set; }
    public int Count { get; set; }

    public virtual Product Product { get; set; }
}
public class AnalysisVM
{
    public int ProductId { get; set; }
    public JObject SKU { get; set; }
    public int Count { get; set; }
}

我想在分组后使用AutoMapper项目,就像这样.

var results = await _context.Journals.Where(x => x.Date <= date)
                                     .GroupBy(x => new { x.ProductId, x.SKU })
                                     .ProjectTo<AnalysisVM>(_mapper.ConfigurationProvider)
                                     .ToListAsync();

根据这LINQ GroupBy Aggregation with AutoMapper条,

创建映射器配置文件

CreateMap<string, JObject>().ConvertUsing(s => JObject.Parse(s));

CreateMap<IEnumerable<Journal>, AnalysisVM>()
    .ForMember(dest => dest.ProductId, opt => opt.MapFrom(src => src.FirstOrDefault().ProductId))
    .ForMember(dest => dest.SKU, opt => opt.MapFrom(src => src.FirstOrDefault().SKU))
    .ForMember(dest => dest.Count, opt => opt.MapFrom(src => src.Sum(x => x.Count)));

但事情出了差错.如何使用Project to GroupBy?

[2024-03-04 16:59:36 DBG 47] <Microsoft.EntityFrameworkCore.Query> Compiling query expression: 
'DbSet<Journal>()
    .Where(x => x.Date <= __date_0)
    .GroupBy(x => new { 
        ProductId = x.ProductId, 
        SKU = x.SKU
     })
    .Select(dtoIGrouping`2 => new Object_7062817___SKU{ __SKU = dtoIGrouping`2.FirstOrDefault().SKU }
    )
    .Select(dtoLet => new AnalysisVM{ 
        ProductId = dtoIGrouping`2.FirstOrDefault().ProductId, 
        SKU = JObject.Parse(dtoLet.__SKU), 
        Count = dtoIGrouping`2.Sum(x => x.Count)
    }
    )' 

[2024-03-04 16:59:36 ERR 47] <Web.Infrastructure.Filters.HttpGlobalExceptionFilter> The LINQ expression 'dtoIGrouping`2' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information. 

程序包版本

"AutoMapper"版本="12.0.1"

"Microsoft.EntityFrameworkCore"版本="6.0.13"

"Pomelo.EntityFrameworkCore.MySql"版本="6.0.2"

推荐答案

JObject的"自动"映射是问题所在:

CreateMap<string, JObject>().ConvertUsing(s => JObject.Parse(s));

try 内联它(适用于我最新的EF Core和AutoMapper):

CreateMap<IEnumerable<Journal>, AnalysisVM>()
    .ForMember(dest => dest.SKU, opt => opt.MapFrom(src => JObject.Parse(src.FirstOrDefault().SKU)))
    // ... 
    ;

就我个人而言,我在这里只使用"手动"投影,这也将允许使用分组键来潜在地允许EF生成更好的SQL(虽然您也可以使用AutoMapper来设置它,但然后您将需要为分组键创建一个类型):

var results = await _context.Journals.Where(x => x.Date <= date)
    .GroupBy(x => new { x.ProductId, x.SKU })
    .Select(g => new AnalysisVM
    {
        ProductId = g.Key.ProductId,
        // .. 
    })
    .ToListAsync();

Csharp相关问答推荐

当Visual Studio处于升级管理模式时,无法安装Torch运行时

ASP.NET MVC购物车数量更新并从购物车中删除项目

如何使用C#和Graph API从Azure Directory获取用户详细信息

HttpContext. RequestAborted当Android APP失go 连接时未取消

迭代C#List并在数据库中 for each 元素执行SELECT语句—更有效的方式?

如何使用ConcurentDictionary属性上的属性将自定义System.Text.Json JsonConverter应用于该属性的值?

Int和uint相乘得到LONG?

我想在文本框悬停时在其底部显示一条线

C#和ASP.NET核心标识:提高GetUserAsync调用的性能

C#中Java算法的类似功能

如何在onNext之前等待订阅者完成?

未显示详细信息的弹出对话框

在构造函数中传递C#函数以用作EventHandler委托的订阅服务器

为什么当我try 为玩家角色设置动画时,没有从文件夹中拉出正确的图像?

如何在C#.NET桌面应用程序中动态更改焦点工具上的后退 colored颜色

如何读取TagHelper属性的文本值?

为什么连接到Google OAuth2后,结果.Credential为空?

将文本从剪贴板粘贴到RichTextBox时,新文本不会在RichTextBox ForeColor中着色

实例化列表时的集合表达式是什么?

将两个JSON文件与覆盖值的主文件合并