Сохраняя лямбда в качестве делегата, вы храните конкретный экземпляр делегата, который выполняет какое-либо действие. Его нельзя изменить, просто назовите его. После того, как у вас есть ваш делегат, у вас есть ограниченные возможности в проверке того, что он делает и чего еще нет.
Сохраняя лямбда как выражение, вы храните дерево выражений, которое представляет делегат. Его можно манипулировать, чтобы делать другие вещи, такие как изменение его параметров, изменение тела и заставить его сделать что-то радикально другое. Его можно даже скомпилировать обратно делегату, чтобы вы могли его назвать, если хотите. Вы можете легко проверить выражение, чтобы узнать, что его параметры, что он делает и как он это делает. Это то, что поставщик запросов может использовать для понимания и перевода выражения на другой язык (например, написать SQL-запрос для соответствующего дерева выражений).
Также гораздо проще создать делегат динамически с использованием выражений, чем он испускает код. Вы можете придумать свой код на более высоком уровне как выражения, которые очень похожи на то, как компилятор просматривает код, а не выходит на низкий уровень и просматривает ваш код как инструкции IL.
Значит, вы можете сделать гораздо больше, чем просто анонимный делегат. Несмотря на то, что он не является бесплатным, производительность будет иметь успех, если вы выполняете скомпилированные выражения по сравнению с обычным методом или анонимным делегатом. Но это может не быть проблемой, так как другие преимущества использования выражений могут быть важны для вас.
Это прояснило это для меня, спасибо большое :-) – Steffen