【发布时间】: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