使用Linq时不存在

本文关键字:不存在 Linq 使用 | 更新日期: 2023-09-27 18:07:51

对不起我的英语,我会尽量简明扼要。

我要上"ALUMNOS"answers"MATERIAS"两张桌子。SQL中存在另一个表"ALUMNOS BY MATERIAS"。我知道这在EF中没有必要,因为存在属性导航,但我需要获得未在任何MATERIAS中注册的ALUMNOS。

我想要这样的东西:

   SELECT *
     FROM ALUMNOS AS A
    WHERE NOT EXISTS(
               SELECT MA.MATERIAID 
                 FROM MATERIASXALUMNO AS MA 
                WHERE A.LEGAJO = MA.LEGAJO
                  AND .MATERIAID = XXX) 

但我的困惑开始了,因为在Aluminos实体中,我有《材料集》,反之亦然,但我没有《Aluminos MaterialID》或《材料AluminosID》,所以我如何用linq做到这一点??

总之,我需要的是获得未参加XX材料的校友和他们参加该材料的校友。。。

提前感谢,我希望能帮助我,我使用存储过程修复它,但我希望它与Linq一起使用,或者至少了解它的工作情况。。。

阿根廷致以问候!Guille

使用Linq时不存在

如果您的导航属性被映射为Alumo.Materials会为您提供Alumno注册的Materials集合,那么您会想要这样的东西:

var missing = dbcontext.Alumnos.Where(a => !a.Materias.Any(m => m.MateriaID == XXX));

只要Aluminos和MATERIAS之间的关系如所述映射,这就有效。它允许我们将它们视为对象而不是表。在后台,它生成使用EXISTS或NOT EXISTS的SQL,MATERIASXALUMINO和LEGAJO也会自动使用。但映射可以让实体框架抽象掉这一点。

.Any()用于Exists,您可以使用!Any() 将其反转

//assuming that ALUMNOS and MATERIASXALUMNO have FK A.LEGAJO = MA.LEGAJO
from a in context.Alumnos
where !a.MATERIASXALUMNO.Where(ma=>ma.MATERIAID == XXX).Any()
select a

或者,如果不是,则

from a in context.Alumnos
where !context.MATERIASXALUMNO.Where(ma=>ma.MATERIAID == XXX && a.LEGAJO == ma.LEGAJO)
                              .Any()
select a

我使用Where(predicate)Any()只是为了保持清晰,但您也可以合并并只使用Any(predicate of where),如另一篇文章

所示

你看起来像:

var existing = (from alumno in datacontext.Alumnos
                where datacontext.Materias.Any(m => m.AlumnoID == alumno.AlumnoID)
                select alumno);

var missing = (from alumno in datacontext.Alumnos
                where !datacontext.Materias.Any(m => m.AlumnoID == alumno.AlumnoID)
                select alumno);