2

我有这个工作正常的查询,

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<TSource>(System.Collections.Generic.IEnumerable<TSource>, TSource)'无法从用法中推断出方法的类型参数。尝试明确指定类型参数。

4

1 回答 1

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
};
于 2012-06-17T16:54:45.083 回答