Конечно, есть много таких подходов, как синхронный запрос, обещание, но из моего опыта я думаю, что вы должны использовать подход обратного вызова. Естественно, что асинхронное поведение Javascript. Итак, ваш фрагмент кода можно переписать немного иначе:
function foo() {
var result;
$.ajax({
url: '...',
success: function(response) {
myCallback(response);
}
});
return result;
}
function myCallback(response) {
// Does something.
}
Проблема может быть решена с помощью combined expressions
проекта LINQKit .
Вот как это сделать:
LinqKit
для вашего проекта (например, через диспетчер пакетов NuGet). using LinqKit; // for System.Linq.Expressions.Expression<>.Invoke()
public static System.Linq.Expressions.Expression<
System.Func<%type of ra% ra, %status type%>>
GetStatusExpression = ra != null ? ... : ...;
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) == ...)
{
...
Большая благодарность за то, что он указал мне в правильном направлении с его комментарием.
Редактирование моего ответа с тех пор, как я не поймал проблему перевода EF.
Используя код ванили, когда вы пытаетесь абстрагировать это, у вас всегда будет функция делегировать работу (из-за к тому факту, что ваше выражение станет Expression<Func<T>>
), что означает, что поставщик запросов будет задыхаться, когда он окажется неспособным интерпретировать делегат функции. Чтобы обойти это, вам придется полагаться на библиотеку, такую как LINQKit, чтобы вы могли объединять выражения вместе или в основном писать сами. (См. это обсуждение ).
Похоже, что мотив этого кода состоит в том, чтобы по существу выполнить левое соединение и заменить значение по умолчанию вместо нуля для строк, которые не иметь матч. Я думаю, в этом случае необходимо понять, чего вы пытаетесь достичь. Есть хороший шанс, что вам лучше будет перемещать логику вверх или вниз по слою. Вы можете переместить логику значений по умолчанию в представление или хранимую процедуру в базе данных для ее консолидации. Вы также можете использовать подход, который вы собираетесь выполнить, сначала вытащив результирующий набор, а затем сделав запрос на объекты в памяти, поэтому вам не нужно беспокоиться о том, чтобы сделать его переводимым в SQL-запрос.