【问题标题】:Exception: Type arguments cannot be inferred when using LINQ例外:使用 LINQ 时无法推断类型参数
【发布时间】:2012-06-17 16:43:39
【问题描述】:

这个查询没问题,

select *
from Materia 
where
  Cursar_Cursada=0
  and idmateria NOT IN (
      select IdMateria
      from UsuarioMateria
      where IdUsuario=11
  ) 
  or Cursar_Cursada in (
    select Materia.Codigo_Materia
    from UsuarioMateria join Materia on UsuarioMateria.IdMateria = Materia.IdMateria
  )

当我尝试为相同目的创建 LINQ 时,我没有得到预期的结果。

 from t in obj.Materias
 where
   t.Cursar_Cursada == 0 &&
   !(from t0 in obj.UsuarioMaterias
     where
       t0.IdUsuario == 11
     select new
     {
         t0.IdMateria
     }).Contains(new { t.IdMateria }) ||

     (from t0 in obj.UsuarioMaterias
      join t1 in obj.Materias on t0.IdMateria equals      IdMateria
      select new
      {
          t1.Codigo_Materia
      }).Contains(new { t.Cursar_Cursada })   // <- error here
 select new
 {
     t.IdMateria,
     t.Nombre,
     t.Cuatrimestre,
     t.Contenido,
     t.Cursar_Cursada,
     t.Cursar_Aprobada,
     t.Rendir_Aprobada,
     t.Codigo_Materia
 };

错误出现在.Contains(new { t.Cursar_Cursada }) 的行上,它说:

方法'System.Linq.Enumerable.Contains&lt;TSource&gt;(System.Collections.Generic.IEnumerable&lt;TSource&gt;, TSource)' 的类型参数无法从用法中推断出来。尝试明确指定类型参数。

【问题讨论】:

  • 任何帮助将不胜感激!
  • 重新格式化以便更容易阅读您的代码
  • 你可以试试 .Contains(t.Cursar_Cursada) 吗?
  • 好的,谢谢。是的,我试过了,但错误仍然是一样的
  • 成功了吗?如果是这样,我会把它作为答案发布。

标签: c# sql linq


【解决方案1】:

您不需要每次都实例化单一属性匿名类型来执行Contains 检查。相反,您应该直接select您的财产:

from t in obj.Materias
where t.Cursar_Cursada == 0 &&
!(  
    from t0 in obj.UsuarioMaterias
    where t0.IdUsuario == 11
    select t0.IdMateria
).Contains(t.IdMateria) ||
(   
    from t0 in obj.UsuarioMaterias
    join t1 in obj.Materias on t0.IdMateria equals t1.IdMateria
    select t1.Codigo_Materia
).Contains(t.Cursar_Cursada)
select new
{
    t.IdMateria,
    t.Nombre,
    t.Cuatrimestre,
    t.Contenido,
    t.Cursar_Cursada,
    t.Cursar_Aprobada,
    t.Rendir_Aprobada,
    t.Codigo_Materia
};

或者,您可以将您的 Contains 运算符转换为 Any,方法是将相等检查作为内部查询中的一个条件:

from t in obj.Materias
where t.Cursar_Cursada == 0 &&
!(
    from t0 in obj.UsuarioMaterias
    where t0.IdUsuario == 11 && 
          t0.IdMateria == t.IdMateria
    select t0
).Any() ||
(   
    from t0 in obj.UsuarioMaterias
    join t1 in obj.Materias on t0.IdMateria equals t1.IdMateria
    where t1.Codigo_Materia == t.Cursar_Cursada
    select t1
).Any()
select new
{
    t.IdMateria,
    t.Nombre,
    t.Cuatrimestre,
    t.Contenido,
    t.Cursar_Cursada,
    t.Cursar_Aprobada,
    t.Rendir_Aprobada,
    t.Codigo_Materia
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多