Ich versuche zu suchen, wie es geht, und hier ist, was ich herauskommen:
int[] langIds = new int[] { 1, 3, 5 };
var lang = _context.Languages.Where(x => langIds.Contains(x.id));
var result = _context.Students.Where(x => !lang
.Except(x.StudentLanguages
.Select(y => y.Language)
.Intersect(lang)).Any());
Hier verwende ich Except
und Intersect
LinqToSql Erweiterungsmethoden.
Es produziert diese SQL-Anweisung:
SELECT [t0].[id], [t0].[name]
FROM [dbo].[Student] AS [t0]
WHERE NOT (EXISTS(
SELECT NULL AS [EMPTY]
FROM (
SELECT DISTINCT [t1].[id], [t1].[name]
FROM [dbo].[Language] AS [t1]
WHERE (NOT (EXISTS(
SELECT NULL AS [EMPTY]
FROM (
SELECT DISTINCT [t3].[id], [t3].[name]
FROM [dbo].[StudentLanguage] AS [t2]
INNER JOIN [dbo].[Language] AS [t3] ON [t3].[id] = [t2].[langId]
WHERE (EXISTS(
SELECT NULL AS [EMPTY]
FROM [dbo].[Language] AS [t4]
WHERE ([t3].[id] = [t4].[id]) AND ([t4].[id] IN (@p0, @p1, @p2))
)) AND ([t2].[studentId] = [t0].[id])
) AS [t5]
WHERE [t1].[id] = [t5].[id]
))) AND ([t1].[id] IN (@p3, @p4, @p5))
) AS [t6]
))
Bitte beachte, dass ich Sprachen aus der Datenbank zu füllen. Leider Sie können nicht lokale Sammlungen in Ihrer Abfrage verwenden, da LinqToSQL nicht wissen, wie man sie in SQL übersetzt.Wenn Sie die gleiche Sache mit lokalen int-Array oder einer anderen Sammlung tun, werden Sie diese Ausnahme erhalten:
LINQ to SQL-Ausnahme: Lokale Sequenz kann nicht in LINQ verwendet werden Implementierung von Abfrageoperatoren in SQL außer der Betreiber Enthält
Alles, was mir einfällt, ist das Durchlaufen Ihres Arrays und das Ausführen einer separaten Abfrage innerhalb jeder Schleifeniteration. Dann können Sie die Ergebnisse zusammen in eine Ergebnismenge – rory
@rory verschmelzen, aber OP möchte Lösung in linqToSQL ich gess –
@teovankot Antwort mit Pseudo-Code gegeben – rory