2009-02-15 3 views
12

Desidero tradurre l'albero di espressioni LINQ in istruzione SQL e non voglio scrivere il mio codice per questo.Traduci istruzione LINQ to sql

Esempio:

var query = from c in Customers 
where c.Country == "UK" && 
     c.City == "London" 
select c); 

Per

SELECT ... FROM Customers AS c WHERE c.Country = "UK" AND c.City = "London" 

lo so DataContext.Log, ma voglio usare:

query.ToSqlStatementString() 

risposta

17
CustomDataContext dc = new CustomDataContext(); 
IQueryable<Customer> query = 
    from c in dc.Customer 
    where c.Country == "UK" 
    select c; 
// 
string command = dc.GetCommand(query).CommandText; 
+0

Va bene:) ... ma ho bisogno di una connessione db aperta per ottenere questo lavoro :) (Non so perché:)) ... sai come in altro modo? – zielu1

10

risposta di David B si ottiene ciò che si vuole, ma c'è il costo nascosto di requirin g una connessione al database. Il motivo per cui questo è fatto è determinare la versione del server SQL chiedendo al server stesso. Per evitare questo, è necessario utilizzare questo frammento di codice:

/// <summary> 
/// Through reflection (HACK) this sets the MS impl of LINQ-to-SQL to not attempt connection to the database just 
/// to determine the SQL server version running to tailor the SQL query to. 
/// </summary> 
private static void hack_SetLINQ2SQLProviderMode(CustomDataContext db) 
{ 
    object provider = hack_GetLINQ2SQLProvider(db); 

    provider 
     .GetType() 
     .GetField("mode", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) 
     .SetValue(provider, 2); 
} 

private static object hack_GetLINQ2SQLProvider(CustomDataContext db) 
{ 
    return db 
     .GetType() 
     .GetProperty("Provider", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic) 
     .GetValue(_db, new object[0]); 
} 

chiamata hack_SetLINQ2SQLProviderMode(db) dove db è il vostro DataContext classe derivata.

Questo imposterà il campo mode dell'implementazione di MS di LINQ-to-SQL IQueryProvider per indicare che si intende generare codice SQL per MS SQL Server 2005, indicato da SetValue(provider, 2). Utilizzare 1 per MS SQL Server 2000 o 3 per MS SQL Server 2008.

Ciò significa che dal momento che il campo mode è impostata, l'attuazione non ha più bisogno di aprire la connessione al database SQL e ora si può lavorare completamente offline.

Si prega di notare che questo sta usando una riflessione piena di fiducia, da quello che ho capito. Dovresti utilizzare questo approccio solo in un ambiente che controlli e che si fida del tuo assembly.

+1

* Boggle *. Neat. –