Редактирование моего ответа с тех пор, как я не поймал проблему перевода EF.
Используя код ванили, когда вы пытаетесь абстрагировать это, у вас всегда будет функция делегировать работу (из-за к тому факту, что ваше выражение станет Expression
), что означает, что поставщик запросов будет задыхаться, когда он окажется неспособным интерпретировать делегат функции. Чтобы обойти это, вам придется полагаться на библиотеку, такую как LINQKit, чтобы вы могли объединять выражения вместе или в основном писать сами. (См. это обсуждение ).
Похоже, что мотив этого кода состоит в том, чтобы по существу выполнить левое соединение и заменить значение по умолчанию вместо нуля для строк, которые не иметь матч. Я думаю, в этом случае необходимо понять, чего вы пытаетесь достичь. Есть хороший шанс, что вам лучше будет перемещать логику вверх или вниз по слою. Вы можете переместить логику значений по умолчанию в представление или хранимую процедуру в базе данных для ее консолидации. Вы также можете использовать подход, который вы собираетесь выполнить, сначала вытащив результирующий набор, а затем сделав запрос на объекты в памяти, поэтому вам не нужно беспокоиться о том, чтобы сделать его переводимым в SQL-запрос.