उस स्थिति में जहां कोई ADO.NET एंटिटी फ्रेमवर्क का उपयोग कर रहा है , इकोस्टॉर्म का समाधान भी पूरी तरह से काम करता है। लेकिन इसके चारों ओर अपना सिर लपेटने में मुझे कुछ मिनट लगे। मान लें कि आपके पास एक डेटाबेस संदर्भ है, डीसी, और तालिका x में पंक्तियों को तालिका 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);
एंडी की टिप्पणी के जवाब में, हां, एक LINQ क्वेरी में दो से हो सकता है। यहां सूचियों का उपयोग करते हुए एक पूर्ण कार्य उदाहरण दिया गया है। प्रत्येक वर्ग, फू और बार में एक आईडी है। फू के पास बार के माध्यम से Foo.BarId का "विदेशी कुंजी" संदर्भ है। कार्यक्रम सभी फू का चयन एक संबंधित बार से जुड़ा नहीं है।
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; }
}