In dem Fall, in dem man die verwendet Wenn Sie ADO.NET Entity Framework verwenden , funktioniert die EchoStorm-Lösung ebenfalls einwandfrei. Aber ich brauchte ein paar Minuten, um meinen Kopf darum zu wickeln. Angenommen, Sie haben einen Datenbankkontext, dc, und möchten Zeilen in Tabelle x finden, die nicht in Tabelle y verknüpft sind, sieht die vollständige Antwort wie folgt aus:
var linked =
from x in dc.X
from y in dc.Y
where x.MyProperty == y.MyProperty
select x;
var notLinked =
dc.X.Except(linked);
Als Antwort auf Andys Kommentar kann man in einer LINQ-Abfrage zwei von haben. Hier ist ein vollständiges Arbeitsbeispiel mit Listen. Jede Klasse, Foo und Bar, hat eine ID. Foo hat einen "Fremdschlüssel" -Referenz auf Bar über Foo.BarId. Das Programm wählt alle Foo's aus, die nicht mit einer entsprechenden Leiste verknüpft sind.
class Program
{
static void Main(string[] args)
{
// Creates some foos
List<Foo> fooList = new List<Foo>();
fooList.Add(new Foo { Id = 1, BarId = 11 });
fooList.Add(new Foo { Id = 2, BarId = 12 });
fooList.Add(new Foo { Id = 3, BarId = 13 });
fooList.Add(new Foo { Id = 4, BarId = 14 });
fooList.Add(new Foo { Id = 5, BarId = -1 });
fooList.Add(new Foo { Id = 6, BarId = -1 });
fooList.Add(new Foo { Id = 7, BarId = -1 });
// Create some bars
List<Bar> barList = new List<Bar>();
barList.Add(new Bar { Id = 11 });
barList.Add(new Bar { Id = 12 });
barList.Add(new Bar { Id = 13 });
barList.Add(new Bar { Id = 14 });
barList.Add(new Bar { Id = 15 });
barList.Add(new Bar { Id = 16 });
barList.Add(new Bar { Id = 17 });
var linked = from foo in fooList
from bar in barList
where foo.BarId == bar.Id
select foo;
var notLinked = fooList.Except(linked);
foreach (Foo item in notLinked)
{
Console.WriteLine(
String.Format(
"Foo.Id: {0} | Bar.Id: {1}",
item.Id, item.BarId));
}
Console.WriteLine("Any key to continue...");
Console.ReadKey();
}
}
class Foo
{
public int Id { get; set; }
public int BarId { get; set; }
}
class Bar
{
public int Id { get; set; }
}