многоразовый объект linq sql select part [duplicate]

Конечно, есть много таких подходов, как синхронный запрос, обещание, но из моего опыта я думаю, что вы должны использовать подход обратного вызова. Естественно, что асинхронное поведение Javascript. Итак, ваш фрагмент кода можно переписать немного иначе:

function foo() {
    var result;

    $.ajax({
        url: '...',
        success: function(response) {
            myCallback(response);
        }
    });

    return result;
}

function myCallback(response) {
    // Does something.
}
2
задан ViRuSTriNiTy 30 March 2015 в 14:25
поделиться

2 ответа

Проблема может быть решена с помощью combined expressions проекта LINQKit .

Вот как это сделать:

  1. Добавьте LinqKit для вашего проекта (например, через диспетчер пакетов NuGet).
  2. Добавьте следующую строку поверх вашего .cs-файла, чтобы сделать доступными методы расширения LINQKit
    using LinqKit; // for System.Linq.Expressions.Expression<>.Invoke()
    
  3. Определить выражение как статическое поле
    public static System.Linq.Expressions.Expression<
      System.Func<%type of ra% ra, %status type%>>
        GetStatusExpression = ra != null ? ... : ...;
    
  4. Вызвать выражение в запросе (обязательно добавить .AsExpandable () в первую таблицу, как описано в LINQKit docs)
    var lQuery = 
      from m in %first table%.AsExpandable() ...
      join a in ... into ta
      from ra in ta.DefaultIfEmpty()
      select 
        new {
          ...
          Status = GetStatusExpression.Invoke(ra),
          ...
        };
    

Если вы хотите использовать выражение в «нормальном» коде, вам нужно сначала скомпилировать его, как

 public static System.Func<%type of ra% ra, %status type%>
    GetStatusExpressionCompiled = GetStatusExpression.Compile();

 ...

 if (GetStatusExpressionCompiled(ra) == ...)
 {
   ...

Большая благодарность за то, что он указал мне в правильном направлении с его комментарием.

1
ответ дан ViRuSTriNiTy 28 August 2018 в 18:42
поделиться

Редактирование моего ответа с тех пор, как я не поймал проблему перевода EF.

Используя код ванили, когда вы пытаетесь абстрагировать это, у вас всегда будет функция делегировать работу (из-за к тому факту, что ваше выражение станет Expression<Func<T>>), что означает, что поставщик запросов будет задыхаться, когда он окажется неспособным интерпретировать делегат функции. Чтобы обойти это, вам придется полагаться на библиотеку, такую ​​как LINQKit, чтобы вы могли объединять выражения вместе или в основном писать сами. (См. это обсуждение ).

Похоже, что мотив этого кода состоит в том, чтобы по существу выполнить левое соединение и заменить значение по умолчанию вместо нуля для строк, которые не иметь матч. Я думаю, в этом случае необходимо понять, чего вы пытаетесь достичь. Есть хороший шанс, что вам лучше будет перемещать логику вверх или вниз по слою. Вы можете переместить логику значений по умолчанию в представление или хранимую процедуру в базе данных для ее консолидации. Вы также можете использовать подход, который вы собираетесь выполнить, сначала вытащив результирующий набор, а затем сделав запрос на объекты в памяти, поэтому вам не нужно беспокоиться о том, чтобы сделать его переводимым в SQL-запрос.

0
ответ дан Community 28 August 2018 в 18:42
поделиться
Другие вопросы по тегам:

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