ADO.NET Entity Framework를 사용하는 경우 EchoStorm의 솔루션도 완벽하게 작동합니다. 그러나 머리를 감싸는 데 몇 분이 걸렸습니다. 데이터베이스 컨텍스트 dc가 있고 테이블 y에서 링크되지 않은 테이블 x에서 행을 찾으려고 가정하면 전체 답변은 다음과 같습니다.
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);
Andy의 의견에 응답하여 LINQ 쿼리에서 from을 두 개 가질 수 있습니다. 다음은 목록을 사용하는 완전한 작업 예입니다. 각 클래스 인 Foo and Bar에는 ID가 있습니다. Foo에는 Foo.BarId를 통해 Bar에 대한 "외부 키"참조가 있습니다. 프로그램은 해당 바에 연결되지 않은 모든 Foo를 선택합니다.
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; }
}