Ich benutze .NET 4.5 in C#, und ich habe zwei Sammlungen von verschiedenen Klassen, die ich vergleichen möchte. Sie haben einige Spalten mit ähnlichen Namen, aber sie implementieren keine gemeinsame Schnittstelle (und können aus Gründen des Codierungsstandards nicht).linq - Wie findet man heraus, ob die Schlüsselspalten einer Sammlung eine Untermenge einer anderen Sammlung sind?
Die erste Klasse sieht wie folgt aus:
class Foo
{
string Key1 {get; set;}
string Key2 {get; set;}
string NotKey {get; set;}
string AlsoNotKey {get; set;}
}
Während die zweite sieht wie folgt aus:
class Bar
{
string Key1 {get; set;}
string Key2 {get; set;}
}
Was ich tun möchte, ist eine Sammlung von Foo
in eine Methode übergeben und das Rück true
wenn jedes einzelne Paar von Key1
und Key2
darin eine Übereinstimmung in einer Sammlung von Bar
hat, die von einer Datenbank (über EF) abgerufen wird, aber ich kann nicht herausfinden, wie man das macht.
Meine erste Idee etwas so aussah ...
//IEnumerable<Foo> foos
//DbSet<Bar> bars
foos.All(foo => foo.Key1 == bars.Key1 && foo.Key2 == bars.Key2)
... aber es funktioniert nicht, weil bars
eine Sammlung zu, und ich kann nur Contains()
nicht um jede Spalte verwenden, weil dann Es wird nicht beide Spalten als ein Paar vergleichen.
In SQL, kann ich etwas tun, wie
SELECT COUNT(*)
FROM foos
JOIN bars
ON foos.key1 = bars.key1
AND foos.key2 = bars.key2
und vergleichen Sie es mit der Anzahl der Datensätze in foos
von selbst, aber wie kann ich das LINQ übersetzen?
Bearbeiten: Gefunden diese verwandte Frage. How to use linq `Except` with multiple properties with different class?
Könnte etwas so versuchen, es sei denn, es gibt einen besseren Weg.
foos.All(f => bars.Any(b => f.Key1 == b.Key1 && f.Key2 == b.Key2))
Haben Sie versucht, [LINQ verbinden] (https://msdn.microsoft.com/en-us/library/bb534675.aspx)? Es könnte genau das tun, wonach Sie suchen. –
Sie sollten eine Join-Abfrage in Linq zu Entitäten schreiben. https://msdn.microsoft.com/en-us/library/bb311040.aspx https://msdn.microsoft.com/en-us/library/bb896266(v=vs.110).aspx – DaniDev