【问题标题】:Error in Linq Expression GroupBy in .NET Core 3.1.NET Core 3.1 中的 Linq 表达式 GroupBy 错误
【发布时间】:2021-08-30 06:24:15
【问题描述】:

将代码从 .NET Core 2.1 迁移到 3.1 后,以下 Linq 无法正常工作。它显示了 LinqExpression 中的 InvalidOperationException - GroupByShaperExpression

Message=The LINQ expression '(GroupByShaperExpression:
KeySelector: new { 
    DepotNo = (g.DepotNo), 
    DepotName = (g.DepotName)
 }, 
ElementSelector:(EntityShaperExpression: 
    EntityType: DepartmentWorkTime
    ValueBufferExpression: 
        (ProjectionBindingExpression: EmptyProjectionMember)
    IsNullable: False
)
)
    .Select(dd => new { 
        id = (object)dd.DepotNo + "." + (object)dd.DepartmentID, 
        title = (object)dd.Depot.DepotNo + "." + dd.Department.DepartmentName
     })' 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 either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). 

我有两个模型和另一个视图模型

Depot Model
public class Depot
    {
        [Key]
        public int DepotNo { get; set; }
        public string DepotName {get;set;}
`    }

public class Department 
    {
        [Key]
        public int DepartmentID{ get; set; }
        public string DepartmentName {get;set;} 
    }

public class DepartmentWorkTime
    {
        [Key]
        public int Id { get; set; }
        public int DepotNo { get; set; }
        public int DepartmentID { get; set; }
        public DepotModel Depot { get; set; }
       public DepartmentModel Department { get; set; }
    }

我在Depot模型和Department模型中有以下记录

Depot Model
{1, .AAAA Depot},
{2, BBBB Depot},
{4, CCCC Depot},


Department Model
{1, Retail},
{2, Office},
{3, Field Staff},
{4, Warehouse},


DepartmentWorkTime  List
{1,1,1, Depot Model ,Department Model},
{2,1,2, Depot Model ,Department Model},
{3,1,4, Depot Model ,Department Model},

{4,2,1, Depot Model ,Department Model},
{5,2,2, Depot Model ,Department Model},
{6,2,3, Depot Model ,Department Model},

{7,4,1, Depot Model ,Department Model},

我正在尝试从 linq 获取结果为

[0] = { id = 1, title = "1-AAAA Depot", subs = {System.Collections.Generic.List<<>f__AnonymousType10<string, string>>} }
Subs

[0] { id = "1.1", title = "1.Retail" }  <Anonymous Type>
[1] { id = "1.2", title = "1.Office" }  <Anonymous Type>
[2] { id = "1.4", title = "1.Warehouse" }   <Anonymous Type>

[1] = { id = 2, title = "2-BBBB Depot", subs = {System.Collections.Generic.List<<>f__AnonymousType10<string, string>>} }    
Subs
[0] { id = "2.1", title = "2.Retail" }  <Anonymous Type>
[1] { id = "2.2", title = "2.Office" }  <Anonymous Type>
[2] { id = "2.3", title = "2.Field Staff" } <Anonymous Type>



[2] ={ id = 3, title = "4-CCCC Depot", subs = {System.Collections.Generic.List<<>f__AnonymousType10<string, string>>} }

Subs
[0] { id = "4.1", title = "4.Retail" }  <Anonymous Type>

为此,我编写了如下所示的 linq,它适用于 .Net Core 2.1 但不适用于 3.1

**public JsonResult GetDepotDepartemntsForMap()
        {
            dynamic mappingList = new List<DepotMapModel>();
            mappingList = _unitOfWork.Department.GetDepotWithDepartment();         
            return Json(mappingList);

        }

 
    public class DepartmentMapModel
    {
        public string id { get; set; }
        public string title { get; set; }
    }

    public class DepotMapModel
    {
        public string id { get; set; }
        public string title { get; set; }
        public List<DepartmentMapModel> subs { get; set; }
    }
 
 public dynamic GetDepotWithDepartment()
        {
            var list = goContext.goDepartmentWorkTime.
                GroupBy(d => new { d.DepotNo, d.Depot.DepotName })
            .Select(g => new
            {
                id = g.Key.DepotNo,
                title = g.Key.DepotName,
                subs = g.Select(dd => new
                {
                    id = dd.DepotNo + "." + dd.DepartmentID,
                    title = dd.Depot.DepotNo + "." + dd.Department.DepartmentName
                }).ToList()
            }).ToList();
            
            return list;
        }**

【问题讨论】:

  • Stack Overflow 被这个 GroupBy 错误淹没了。不支持此形状。请查看其他问题。

标签: linq asp.net-core group-by


【解决方案1】:

在新的 EF 核心版本中,它只允许在客户端上评估最后一次 Select() 调用。

可以通过调用goDepartmentWorkTime获取所有数据,所以不需要使用groupby,检查这个:

var list = (from d in _context.goDepartmentWorkTime                      
                     select new
                     {
                         id = d.DepotNo,
                         title = d.Depot.DepotName,
                         subs =  new
                                {
                                    id = d.DepotNo + "." + d.DepartmentID,
                                    title = d.Depot.DepotNo + "." + d.Department.DepartmentName
                                }
                     }).ToList();

结果:

【讨论】:

    猜你喜欢
    • 2021-03-16
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2017-02-09
    • 2020-09-10
    • 2020-08-22
    • 1970-01-01
    相关资源
    最近更新 更多