Переведите LINQ в sql оператор

Проблема в том, что вам нужно дождаться результата. Service.getMaterial возвращает Promise, поэтому при попытке выполнить строку кода var x = data.Vendor; переменные данные еще не определены.

Что вы можете сделать, это просто вызвать функцию внутри результата promise (тогда функция).

Я бы посоветовал вам узнать немного больше о:

  1. Promise
  2. асинхронная / ожидающая схема
  3. [ 117]

    Я также хотел бы, чтобы вы знали, что обещание / async-await не поддерживаются IE вообще, если я не ошибаюсь;)

12
задан Mathieu 3 October 2012 в 23:22
поделиться

2 ответа

CustomDataContext dc = new CustomDataContext();
IQueryable<Customer> query =
  from c in dc.Customer
  where c.Country == "UK"
  select c;
//
string command = dc.GetCommand(query).CommandText;
17
ответ дан 2 December 2019 в 05:28
поделиться

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

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

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

11
ответ дан 2 December 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: