【问题标题】:ASP.NET Core 5 and EF - InvalidOperationExceptionASP.NET Core 5 和 EF - InvalidOperationException
【发布时间】:2021-07-22 03:23:48
【问题描述】:

这个查询的范围,它显示一个按类别>主菜单>子菜单分组的导航菜单。

在 LINQPad 中工作正常,但 Web 应用程序显示以下未处理的错误:

InvalidOperationException:无法在投影中转换集合子查询,因为父查询不会投影在客户端生成结果所需的所有表的键列。当尝试关联无键实体或使用“Distinct”或“GroupBy”操作而不投影所有键列时,可能会发生这种情况。

查询:

var mainMenu = (from c in _unitOfWork.Menu.GetAllQueryable()
                        where c.MenuPadreId == 0
                        select new
                        {
                            Categoria = c.MenuCategoria.Descripcion,
                            CategoriaId = c.MenuCategoriaId
                        }).Distinct();

        var menuNavegacion = from c in mainMenu
                             select new MenuNavegacionCategoriaViewModel
                             {
                                 Categoria = c.Categoria,
                                 CategoriaId = c.CategoriaId,
                                 MenuNavegacionViewModel = (from m in _unitOfWork.Menu.GetAllQueryable()
                                                            where m.MenuPadreId == 0
                                                                  && m.MenuCategoriaId == c.CategoriaId
                                                            select new MenuNavegacionViewModel
                                                            {
                                                                MenuId = m.MenuId,
                                                                MenuPadreId = m.MenuPadreId,
                                                                Descripcion = m.Descripcion,
                                                                Area = m.Area,
                                                                Controlador = m.Controlador,
                                                                Accion = m.Accion,
                                                                TieneUrl = m.TieneUrl,
                                                                CountSubMenu = _unitOfWork.Menu.GetAllQueryable().Count(me => me.MenuPadreId > 0 && me.MenuPadreId == m.MenuId),
                                                                Icono = m.Icono,
                                                                MenuNavegacionSubViewModel = (from s in _unitOfWork.Menu.GetAllQueryable()
                                                                                              where s.MenuPadreId > 0
                                                                                                    && s.MenuPadreId == m.MenuId
                                                                                              group s by new
                                                                                              {
                                                                                                  MenuId = s.MenuId,
                                                                                                  MenuPadreId = s.MenuPadreId,
                                                                                                  Descripcion = s.Descripcion,
                                                                                                  Area = s.Area,
                                                                                                  Controlador = s.Controlador,
                                                                                                  Accion = s.Accion,
                                                                                                  TieneUrl = s.TieneUrl,
                                                                                                  Icono = s.Icono
                                                                                              } into sjoin
                                                                                              select new MenuNavegacionSubViewModel
                                                                                              {
                                                                                                  MenuId = sjoin.Key.MenuId,
                                                                                                  MenuPadreId = sjoin.Key.MenuPadreId,
                                                                                                  Descripcion = sjoin.Key.Descripcion,
                                                                                                  Area = sjoin.Key.Area,
                                                                                                  Controlador = sjoin.Key.Controlador,
                                                                                                  Accion = sjoin.Key.Accion,
                                                                                                  TieneUrl = sjoin.Key.TieneUrl,
                                                                                                  Icono = sjoin.Key.Icono
                                                                                              }).OrderBy(mnsvm => mnsvm.Descripcion).ToList()
                                                            }).OrderBy(mnvm => mnvm.Descripcion).ToList()
                             };

视图模型:

public class MenuNavegacionCategoriaViewModel
{
    public string Categoria { get; set; }
    public int CategoriaId { get; set; }
    public List<MenuNavegacionViewModel> MenuNavegacionViewModel { get; set; }
}

public class MenuNavegacionViewModel
{
    public int MenuId { get; set; }
    public int MenuPadreId { get; set; }
    public string Descripcion { get; set; }
    public string Area { get; set; }
    public string Controlador { get; set; }
    public string Accion { get; set; }
    public List<MenuNavegacionSubViewModel> MenuNavegacionSubViewModel { get; set; }
    public bool TieneUrl { get; set; }
    public int CountSubMenu { get; set; }
    public string Icono { get; set; }
}

public class MenuNavegacionSubViewModel
{
    public int MenuId { get; set; }
    public int MenuPadreId { get; set; }
    public string Descripcion { get; set; }
    public string Area { get; set; }
    public string Controlador { get; set; }
    public string Accion { get; set; }
    public bool TieneUrl { get; set; }
    public string Icono { get; set; }
    public string MenuPadreDescripcion { get; set; }
}

Group by 给我同样的错误。

【问题讨论】:

  • 您是否尝试过拆分查询?您将能够更快地找到错误的位置。这段代码可读性不强。
  • 你能添加你的 DbContext 代码吗?具体来说,您的表的protected override void OnModelCreating(ModelBuilder modelBuilder)?有没有在modelBuilder.HasNoKey()

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


【解决方案1】:

您的一个顶级投影(例如MenuNavegacionCategoriaViewModel)具有不可为空的列(假设为CategoriaId),因为它是从外键列中选择的。让 MenuNavegacionCategoriaViewModel 中的 CategoriaId 为空,它就会飞起来。

【讨论】:

    【解决方案2】:

    此问题是 EF Core 5.0 中的重大更改之一。 不再支持具有相关集合且也使用 Distinct 或 GroupBy 的某些查询。 阅读this了解更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      • 2021-03-06
      • 2021-03-25
      • 1970-01-01
      • 2021-04-30
      相关资源
      最近更新 更多