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 に答える