【问题标题】:Group By then Select inner elements Linq asp.net Core 3Group By then Select内部元素Linq asp.net Core 3
【发布时间】:2020-07-24 18:53:12
【问题描述】:

在做每一件事之前,我尝试了很多答案和修复,但对我没有用, 问题是我试图获取这个 Dto 的列表:

        public string Ministry { get; set; }
        public string Department { get; set; }
        public string EmployeeCount { get; set; }
        public List<string> Accounts { get; set; }

使用这个 linq 查询:

var result = await (from emp in _db.Employees
                                join c in _db.EmployeeBlackList
                                on emp.AccountNo equals c.AccountNo into joined
                                from c in joined.DefaultIfEmpty()
                                group emp by new { emp.Ministry, emp.Department }
                                    into groups
                                select new MinstryDepartmentEmployeeCount()
                                {
                                    Ministry = groups.Key.Ministry,
                                    Department = groups.Key.Department,
                                    EmployeeCount = groups.Count().ToString(),
                                    Accounts = groups.Select(x => x.AccountNo).ToList()
                                }).ToListAsync();

我得到的错误异常是这样的:

发生了一个或多个错误。 (LINQ 表达式 'Select(\r\n source: GroupByShaperExpression:\r\n KeySelector: new { \r\n Ministry = e.Ministry, \r\n Department = e.Department\r\ n }, \r\n ElementSelector:EntityShaperExpression: \r\n EntityType: Employee\r\n ValueBufferExpression: \r\n ProjectionBindingExpression: EmptyProjectionMember\r\n IsNullable: False\r\n , \r\n 选择器: ( x) => x.AccountNo)' 无法翻译。要么以可翻译的形式重写查询,要么通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 的调用显式切换到客户端评估,或 ToListAsync()。有关详细信息,请参阅 https://go.microsoft.com/fwlink/?linkid=2101038。)

我已经知道这个语句会产生错误:

Accounts = groups.Select(x => x.AccountNo).ToList()

我无法获取员工表中的所有信息,因为它有超过 200 万行和超过 7 列。

这个查询的主要目的是转换这个:

Ministry    Department   AccountNo
A           AA           1111
A           AA           2222
B           BB           3333
B           BB           4444

进入这个:

[
  {
    Ministry: 'A' ,
    Department: 'AA' ,
    EmployeeCount: 2 ,
    Accounts:[
               {
                 '1111'  
               },
               {
                 '2222'  
               },
             ]
  },
  {
    Ministry: 'B' ,
    Department: 'BB' ,
    EmployeeCount: 2 ,
    Accounts:[
               {
                 '3333'  
               },
               {
                 '4444'  
               },
             ]
  }
]

提前致谢。

更新:这个问题和我想要的一样,我使用了相同的答案,但我仍然得到相同的错误,所以我相信原因是 asp.net core 迁移到 3.oquestionLink

【问题讨论】:

  • 几个细节可能会有所帮助:哪个 EF 版本(6.x?核心?)? AccountNo 的数据类型?目标数据库(SqlServer、Sqlite 等)?
  • Ef core,accountNo 是 string,目标数据库是 postgres

标签: c# entity-framework linq asp.net-core-3.1


【解决方案1】:

虽然这可能有用,但我自己也遇到了同样的情况。我最终将查询转换为视图,然后使用

https://docs.microsoft.com/en-us/ef/core/modeling/keyless-entity-types?tabs=data-annotations

这种创建我需要的投影的方法,因为这是 EFCore 版本,取决于您如何在数据上下文中创建 Keyless 类型。

我真正从中获得的回报是惊人的速度,查询通常需要 8-18 秒,现在它返回的确切数据只是其中的一小部分。将查询从执行工作的 EFC 移到执行工作的服务器上,此时只有瓶颈是线路。

【讨论】:

  • 有什么我可以不转向查看的吗?
  • 如果没有重构查询以使用 linq 在客户端工作,它可能不会很漂亮,而且查询会很脆弱。查看可能是最简单的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 2021-01-01
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
相关资源
最近更新 更多