Domanda

Esiste un modo in cui posso creare query su un'origine dati (potrebbe essere sql, oracle o access) che ha una clausola where che punta a una ArrayList o a un elenco?

esempio:

Select * from Table where RecordID in (RecordIDList)

Ho visto alcuni modi per farlo con Linq, ma preferirei non ricorrere ad esso se è evitabile.

È stato utile?

Soluzione

Puoi usare String.Join . Prova qualcosa del genere:

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

Come nota a margine questo non ti proteggerà dall'iniezione di SQL - spero che questo esempio ti indichi nella giusta direzione.

Altri suggerimenti

Linq a Sql. RecordList dovrebbe essere un List < T > , non un ArrayList o un IList<T>

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

Questo genererà sql con parametri:

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

Linq genererà tutti i parametri necessari. Alcune implementazioni di database sono limitate nel numero di parametri che possono essere accettati. Il limite di SqlServer2005 è un po 'più di 2000 parametri ... quindi non usare un elenco con più di 2000 elementi.

Ho fatto solo quello che stai cercando di fare con un elenco separato da virgole

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

o da dove i risultati provengono da una selezione separata

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

Sono abbastanza sicuro che non puoi ottenere ciò che cerchi ....

Puoi iterare sul tuo array e aggiungere un parametro al tuo SQL per ognuno. Questo ti dà l'iniezione di SQL, ma assicurati di usare StringBuilder piuttosto che una concatenazione intensa mentre costruisci la tua istruzione SQL.

per es.

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.
}

È possibile scrivere una funzione definita dall'utente con valori di tabella che accetta un elenco di ID e crea una tabella, quindi unire nuovamente il risultato di questa funzione. Questo articolo di Erland Sommarskog descrive come farlo.

In alternativa, è possibile utilizzare i parametri della tabella, nuovi in ??SQL Server 2008 (credo).

O, come diceva Manu, puoi usare XML.

Tuttavia, sconsiglio di utilizzare l'approccio IN String.Join nella risposta accettata poiché è come richiedere l'iniezione di SQL.

Utilizzando Linq to SQL e suppongo che Entity Framework sia possibile effettuare le seguenti operazioni:

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

Funzionerà con entrambi List < > e ArrayList poiché entrambi implementano IEnumerable.

Linq e Lambdas richiedono di invertire il metodo Contains ma funziona e genera un SQL " IN () " Clausola.

Se si utilizza SQL dinamico, è possibile inviare il contenuto delle parentesi come un elenco letterale separato da virgole. Altrimenti puoi usare una variabile XML per inviare più valori. Vedi http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm

Nota Linq to SQL = dead, Fonte: http://blogs.msdn.com/adonet/archive/2008/10/29/update-on-linq-to-sql-and-linq -per-entità-roadmap.aspx

Il framework delle entità è quello che dovresti usare attualmente se vuoi implementare tale architettura.

Inoltre, se stai utilizzando un'altra query di selezione (come suggerisce GordonB) per il tuo " in " clausola sarebbe meglio usare " esiste " invece di " in " ad esempio:

select * from tablename where exists (select id from othertablename where fieldtype=1)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top