Frage

Gibt es eine Möglichkeit, dass ich Abfrage für eine Datenquelle erstellen kann (könnte SQL sein, Oracle oder Access), die eine where-Klausel hat, die an einem Arraylist Punkte oder Liste?

Beispiel:

Select * from Table where RecordID in (RecordIDList)

Ich habe einige Möglichkeiten gesehen mit Linq zu tun, aber ich möchte lieber nicht darauf zurückgreifen, wenn es vermeidbar ist.

War es hilfreich?

Lösung

Sie könnten String.Join verwenden. Probieren Sie etwas wie folgt aus:

String query = "select * from table where RecordId in ({0});";
String formatted = String.Format(query, String.Join(",", list.ToArray()));

Als Randbemerkung Dies wird nicht vor SQL-Injection schützen -. Hoffentlich dieses Beispiel werden Sie in der richtigen Richtung

Andere Tipps

Linq to Sql. Record sollte eine List<T> sein, keine ArrayList oder IList<T>

IEnumerable<TableRow> query =
  from t in db.Table
  where RecordList.Any(r => t.RecordId == r)
  select t;

Dies wird erzeugen SQL mit Parametern:

SELECT *
FROM Table
WHERE RecordId in (@p0, @p1, @p2, @p3, @p4)

Linq wird erzeugen so viele Parameter wie benötigt werden. Einige Datenbank-Implementierungen sind in der Anzahl der Parameter beschränkt, die akzeptiert werden können. SQLServer2005 der Grenze ist ein wenig mehr als 2000 Parameter ... so keine Liste mit mehr als 2000 Elementen verwendet werden.

Ich habe nur getan, was Ihr versucht, mit einer durch Kommata getrennte Liste zu tun

Select * from Table where RecordID in (1,2,34,45,76,34,457,34)

oder wo die Ergebnisse stammen aus einer separaten select

Select * from Table where RecordID in (select recordId from otherTable where afieldtype=1)

Ich bin mir ziemlich sicher, dass Sie nicht erreichen können, was Sie wollen ....

Sie können Ihren Array iterieren und einen Parameter der SQL für jeden hinzuzufügen. Diese bekommt man um SQL-Injection, aber stellen Sie sicher, dass Sie einen Stringbuilder verwenden, anstatt strign Verkettung, wie Sie Ihre SQL-Anweisung aufzubauen.

z.

StringBuilder sql = new StrignBuilder("select * from Table where ");
for  (int i = 0; i < RecordIDLis.Length; i++)
{
    if (i > 0) sql.Append (" OR ");
    sql.Append(" RecordID = @param" + i.ToString() + " ");
    IDbDataParameter param = new Param();
    param.value etc.
}

Sie können einen Tabellenwert benutzerdefinierte Funktion schreiben, die eine Liste von IDs nimmt und erstellt eine Tabelle, dann kommen agains das Ergebnis dieser Funktion. Diese Artikel von Erland Sommarskog beschreibt, wie es zu tun.

Oder könnten Sie Tabellenparameter, neu in SQL Server 2008 (glaube ich) verwenden.

Oder, wie Manu sagte, Sie XML verwenden können.

Allerdings habe ich Beratung gegen die IN String.Join Ansatz in der akzeptierte Antwort verwenden, da es wie zu fragen, für SQL-Injection ist.

Mit Linq to SQL und ich nehme an das Entity Framework können Sie Folgendes tun:

dataContext.Table.Where(t => RecordIDList.Contains(t.RecordID));

Wird mit beiden Liste arbeiten <> und Arraylist, da sie beide IEnumerable implementieren.

Linq und Lambdas verlangen, dass Sie umkehren Enthält die Methode, aber es funktioniert und erzeugt eine SQL „IN ()“ Klausel.

Wenn Sie die dynamische SQL verwenden, können Sie den Inhalt der Klammern als wörtliche durch Kommata getrennte Liste senden. Ansonsten können Sie ein XML-Variable für das Senden von mehreren Werten verwenden. Siehe http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm

Bitte beachten Sie Linq to SQL = tot, Quelle: http://blogs.msdn.com/adonet/archive/2008/10/29/update-on-linq-to-sql-and-linq -zu-Einheiten-roadmap.aspx

Entity Framework ist, was sollten Sie zur Zeit verwenden, wenn Sie eine solche Architektur implementieren möchten.

Darüber hinaus, wenn Sie eine andere Auswahlabfrage verwendet werden (wie GordonB schon sagt) für „in“ -Klausel es besser wäre, statt „in“, zum Beispiel der Verwendung von „existiert“:

select * from tablename where exists (select id from othertablename where fieldtype=1)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top