不存在使用Linq

Gui*_*lle 6 c# linq entity-framework not-exists navigation-properties

对不起我的英语,我会尽量简洁明了.

我必须表"ALUMNOS"和"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) 
Run Code Online (Sandbox Code Playgroud)

但是我的困惑开始了,因为在ALUMNOS实体中我有Mater的Collection,反之亦然,但我没有在Alumnos MateriaID或Materias AlumnosID中,所以我怎么能用linq做到这一点?

总而言之,我需要的是获得未参加XX Materia的Alumnos以及他们在该Materia注册的Alumnos ......

在此先感谢,我希望可以帮助我,我使用存储过程修复它,但我想要它与Linq或至少了解它是如何做的...

来自阿根廷的问候!吉尔

Mys*_*per 8

我想你想要的东西

var missing = dbcontext.Alumnos.Where(a => !a.Materias.Any(m => m.MateriaID == XXX));
Run Code Online (Sandbox Code Playgroud)

它可以访问Alumnos中的Materias集合,而无需担心连接表.(这假设导航属性已正确映射.)


AD.*_*Net 5

使用.Any()forExists并且您可以通过使用反转它!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
Run Code Online (Sandbox Code Playgroud)

或者如果没有那么

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

我正在使用Where(predicate)并且Any()只是为了保持清楚,但是您可以合并并使用Any(predicate of where)也如另一篇文章中所示