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