使用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
如果您的导航属性被映射为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);