【问题标题】:Linq Any - Only primitive types or enumeration types are supported in this contextLinq Any - 在此上下文中仅支持原始类型或枚举类型
【发布时间】:2018-07-27 19:00:55
【问题描述】:

我收到以下错误:

“EntityFramework.SqlServer.dll 中发生'System.NotSupportedException' 类型的未处理异常

附加信息:无法创建“Datos.Especialidad”类型的常量值。此上下文仅支持原始类型或枚举类型。”

尝试更正以下代码时:

IQueryable<Medico> listaMedicos = 
    from unMedico in context.Medico
    select unMedico;

if (medico.Especialidad.Count > 0)
{
    listaMedicos = FiltrarPor(listaMedicos, 
        x => x.Especialidad.Any(e => e.ID == (medico.Especialidad.FirstOrDefault().ID)));
}

return listaMedicos.ToList();

“Medico”和“Especialidad”之间的关系是多对多的关系如下

【问题讨论】:

  • FiltrarPor 到底在做什么?您可能只需要在变量中捕获 medico.Especialidad.FirstOrDefault().ID 并在您的 lambda 中使用它。
  • 这是“FiltrarPor”签名 IQueryable query,Expression> filter = null) 并执行:query = query.Where(filter);
  • 您应该将该代码添加到问题中。
  • @RufusL 这被用于Where,所以他们确实想要Any
  • 试试var id = medico.Especialidad.FirstOrDefault().ID; 然后listaMedicos = FiltrarPor(listaMedicos, x =&gt; x.Especialidad.Any(e =&gt; e.ID == id));

标签: c# entity-framework linq


【解决方案1】:

试试:

if (medico.Especialidad.Count > 0)
{
    var medicoId = medico.Especialidad.FirstOrDefault().ID
    listaMedicos = FiltrarPor(listaMedicos, 
        x => x.Especialidad.Any(e => e.ID == medicoId));
}

实际上,更好的是:

var medicoEspecialidad = medico.Especialidad.FirstOrDefault();
if (medicoEspecialidad != null)
{
    var medicoId = medicoEspecialidad.ID
    listaMedicos = FiltrarPor(listaMedicos, x => x.Especialidad.Any(e => e.ID == medicoId));
}

【讨论】:

  • 这是juharr在评论中建议的,试了之后就可以了。所以我接受它作为正确答案。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多