Ich habe eine Funktion, mit der ich eine Liste von IDs erhalte, und ich muss eine Liste zurückgeben, die einer Beschreibung entspricht, die der ID zugeordnet ist. Z.B:
public class CodeData
{
string CodeId {get; set;}
string Description {get; set;}
}
public List<CodeData> GetCodeDescriptionList(List<string> codeIDs)
//Given the list of institution codes, return a list of CodeData
//having the given CodeIds
}
Wenn ich also die SQL dafür selbst erstellen würde, würde ich einfach Folgendes tun (wobei die in-Klausel alle Werte im codeIds-Argument enthält):
Select CodeId, Description FROM CodeTable WHERE CodeId IN ('1a','2b','3')
In Linq to Sql kann ich anscheinend nicht das Äquivalent der "IN" -Klausel finden. Das Beste, was ich bisher gefunden habe (was nicht funktioniert) ist:
var foo = from codeData in channel.AsQueryable<CodeData>()
where codeData.CodeId == "1" || codeData.CodeId == "2"
select codeData;
Das Problem ist, dass ich keine Liste von "ODER" -Klauseln für linq to sql dynamisch generieren kann, da diese zur Kompilierungszeit festgelegt werden.
Wie erreicht man eine where-Klausel, die eine Spalte in einer dynamischen Werteliste mit Linq to Sql überprüft?
quelle
codeIDs
wäre vermutlich einList<int>
, und alles wäre in Ordnung.Sie könnten auch verwenden:
quelle
Ich hatte die Methode in Jon Skeets Antwort verwendet, aber mir fiel eine andere ein
Concat
. DieConcat
Methode schnitt in einem begrenzten Test etwas besser ab, aber es ist ein Ärger und ich werde wahrscheinlich einfach dabei bleibenContains
, oder vielleicht schreibe ich eine Hilfsmethode, um dies für mich zu tun. In jedem Fall ist hier eine andere Option, wenn jemand interessiert ist:Die Methode
Leistungstest
Dies war nicht im entferntesten wissenschaftlich. Ich kann mir vorstellen, dass Ihre Datenbankstruktur und die Anzahl der in der Liste enthaltenen IDs erhebliche Auswirkungen haben würden.
Ich habe einen Test eingerichtet, bei dem jeweils 100 Versuche durchgeführt wurden
Concat
und bei demContains
bei jedem Versuch 25 Zeilen ausgewählt wurden, die durch eine zufällige Liste von Primärschlüsseln angegeben wurden. Ich habe das ungefähr ein Dutzend Mal ausgeführt, und meistensConcat
kommt die Methode 5 - 10% schneller heraus, obwohl dieContains
Methode einmal nur von einem Smidgen gewonnen wurde.quelle
quelle
So mache ich es mit HashSet
HashSet ist im Grunde fast auf O (1), so dass Ihre Komplexität O (n) bleibt.
quelle