c# - 异常 : Type arguments cannot be inferred when using LINQ

标签 c# sql linq

我的查询运行正常,

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 }) 行它说:

The type arguments for method 'System.Linq.Enumerable.Contains<TSource>(System.Collections.Generic.IEnumerable<TSource>, TSource)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

最佳答案

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

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
};

关于c# - 异常 : Type arguments cannot be inferred when using LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11073043/

相关文章:

c# - 在 C# 中线程化时锁定变量

c# - 一次检查 3 个枚举值?

c# - 从一个数据表构建制表符分隔的文件

sql - 在成员(member)每月购买超过 6 个单位的情况下需要帮助拉行

mysql - 如何显示类别组合的计数?

linq - 我如何使用 Linq 查询计数。查询中的记录

c# - 如何在 EntityFramework 中按 DateTime.Date 分组

c# - 将 Java WebService 的 Java Arraylist 返回转换为 C# Arraylist

php - 在 sql 中使用查询重置表

c# - LINQ 如何强制查询实现?