Gibt es ein Äquivalent einer SQL IN-Anweisung in LINQ zu Objekten?In Anweisung für LINQ zu Objekten
5
A
Antwort
16
Ja - Contains.
var desiredNames = new[] { "Jon", "Marc" };
var people = new[]
{
new { FirstName="Jon", Surname="Skeet" },
new { FirstName="Marc", Surname="Gravell" },
new { FirstName="Jeff", Surname="Atwood" }
};
var matches = people.Where(person => desiredNames.Contains(person.FirstName));
foreach (var person in matches)
{
Console.WriteLine(person);
}
(In LINQ to SQL das endet als "IN" Abfrage auf.)
Beachten Sie, dass in LINQ die oben ist nicht wirklich sehr effizient Objekte. Sie würden besser dran mit einem Join: (. Diese noch mit Punktnotation natürlich getan werden könnte, aber es endet als etwas unordentlicher up)
var matches = from person in people
join name in desiredNames on person.FirstName equals name
select person;
0
I für Innere in dieser gehen Sie Mitglied Kontext. Wenn ich contains
verwendet hätte, würde es 6 mal wiederholen, obwohl die Tatsache, dass es nur zwei Übereinstimmungen gibt. Ich möchte hier nur betonen, dass ich für Joins anstelle von IN Prädikat gehen werde.
var desiredNames = new[] { "Pankaj" };
var people = new[]
{
new { FirstName="Pankaj", Surname="Garg" },
new { FirstName="Marc", Surname="Gravell" },
new { FirstName="Jeff", Surname="Atwood" }
};
var records = (from p in people join filtered in desiredNames on p.FirstName equals filtered select p.FirstName).ToList();
Vielen Dank! Dein Ruf geht dir voraus ;-) –
Warum wird der innere Join hier nicht bevorzugt? Sie wissen, wenn die Leute 10 Datensätze enthalten und selledNames 2 enthält, wird es 20 Mal im Hintergrund iterieren, unabhängig davon, ob es eine Übereinstimmung gibt oder nicht. – Pankaj
@PankajGarg: Bitte nicht so nervös - ich werde nicht immer sofort antworten können. Hast du den unteren Teil meines Beitrags gelesen, der explizit gesagt hat, dass in LINQ to Objects ein Join besser wäre? –