Ответ 1
CustomDataContext dc = new CustomDataContext();
IQueryable<Customer> query =
from c in dc.Customer
where c.Country == "UK"
select c;
//
string command = dc.GetCommand(query).CommandText;
Я хочу перевести дерево выражений LINQ в оператор SQL, и я не хочу писать свой собственный код для этого.
Пример:
var query = from c in Customers
where c.Country == "UK" &&
c.City == "London"
select c);
To
SELECT ... FROM Customers AS c WHERE c.Country = "UK" AND c.City = "London"
Я знаю DataContext.Log
, но я хочу использовать:
query.ToSqlStatementString()
CustomDataContext dc = new CustomDataContext();
IQueryable<Customer> query =
from c in dc.Customer
where c.Country == "UK"
select c;
//
string command = dc.GetCommand(query).CommandText;
Ответ Amy B дает вам то, что вы хотите, но есть скрытая стоимость необходимости подключения к базе данных. Это делается для того, чтобы определить версию сервера 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
.
Это установит поле mode
в MS-реализации LINQ-to-SQL IQueryProvider, чтобы указать, что вы хотите сгенерировать код SQL для MS SQL Server 2005, обозначенный SetValue(provider, 2)
. Используйте 1
для MS SQL Server 2000 или 3
для MS SQL Server 2008.
Это означает, что, поскольку поле mode
установлено, реализации больше не нужно открывать соединение SQL с базой данных, и теперь вы можете работать полностью автономно.
Пожалуйста, обратите внимание, что это использует отражение полного доверия, насколько я понимаю. Вы должны использовать этот подход только в среде, которой вы управляете и которая полностью доверяет вашей сборке.