Перевести LINQ на SQL заявление - PullRequest
12 голосов
/ 15 февраля 2009

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

Пример:

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()

Ответы [ 2 ]

17 голосов
/ 15 февраля 2009
CustomDataContext dc = new CustomDataContext();
IQueryable<Customer> query =
  from c in dc.Customer
  where c.Country == "UK"
  select c;
//
string command = dc.GetCommand(query).CommandText;
11 голосов
/ 10 июня 2010

Ответ Дэвида Б. дает вам то, что вы хотите, но есть скрытая стоимость необходимости подключения к базе данных. Это делается для того, чтобы определить версию сервера 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 IQueryProvider для LINQ-to-SQL, чтобы указать, что вы хотите создать код SQL для MS SQL Server 2005, обозначенный SetValue(provider, 2). Используйте 1 для MS SQL Server 2000 или 3 для MS SQL Server 2008.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...