2009-02-15 3 views
12

Я хочу перевести дерево выражений LINQ в оператор SQL, и я не хочу писать свой собственный код для этого.Перевести LINQ to sql statement

Пример:

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

Для

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

Я знаю DataContext.Log, но я хочу использовать:

query.ToSqlStatementString() 

ответ

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

Это нормально:) ... но мне нужно открыть соединение db, чтобы получить эту работу :) (я не знаю, почему:)) ... знаете ли вы, как иначе? – zielu1

10

ответ David B получает вас, что вы хотите, но есть скрытая стоимость requirin g соединение с базой данных. Причина этого заключается в том, чтобы определить версию сервера SQL, запросив сам сервер. Чтобы избежать этого, вы должны использовать этот код:

/// <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]); 
} 

вызов hack_SetLINQ2SQLProviderMode(db) где db твой DataContext производного класса.

Это установит поле ввода-вывода IQueryProvider от LINQ to SQL, чтобы указать, что вы хотите создать код SQL для MS SQL Server 2005, указанный SetValue(provider, 2). Используйте 1 для MS SQL Server 2000 или 3 для MS SQL Server 2008.

Это означает, что, поскольку mode поле установлено, реализация больше не нужно, чтобы открыть подключение SQL к базе данных, и теперь вы можете работать в автономном режиме.

Обратите внимание, что это использование отражения полного доверия, исходя из того, что я понимаю. Этот подход следует использовать только в среде, которую вы контролируете, и которая полностью доверяет вашей сборке.

+1

* Boggle *. Ухоженная. –

Смежные вопросы