Пожалуйста, взгляните на Why would you use Expression<Func<T>> rather than Func<T>?.
В принятом ответе описывается, что Func<T>
является делегатом метода, который возвращает T
. Expression<Func<T>>
Однако на самом деле это описание того, как этот делегат может быть оценен. Вы можете, например, compile an expression в фактический делегат:
Expression<Func<int, bool>> expr = i => i < 5;
Func<int, bool> deleg = expr.Compile();
Console.WriteLine("deleg(4) = {0}", deleg(4));
Вы можете даже написать:
Console.WriteLine("deleg(4) = {0}", expr.Compile()(4));
Так что, если вам действительно нужно выражение вам нужно собрать его в фактический делегат иным образом использовать делегат первое место.
(BTW:. Ваш пример кода не скомпилируется, так как нет Select
метод для List<user>
, который принимает выражение, а также d => d.user.username
, вероятно, неправильно С d
является user
она должна быть d => d.username
).
Однако linq для сущностей не поддерживает вызовы делегатов. Поэтому вы должны переключиться на LINQ к объектам путем добавления AsEnumerable()
:
Expression<Func<user, string>> expr = d => d.username;
Func<user, string> func = expr.Compile();
var result = context.Message.AsEnumerable()
.Select(b => new { name = b.user.Select(func) });
Использование LINQ для лиц, для доступа к данным, простой порядок, фильтрации и т.д. Таким образом, он может оптимизировать запросы к базе данных, но затем включите к linq к объектам, если вам нужно больше.
PS: Лямбда d => d.username
скомпилирована в делегат. Если вы явно помещаете его в выражение b.user.Select(u => u.username)
, он будет работать нормально, потому что теперь он также компилируется в выражение, которое linq для объектов может обрабатывать без вызова делегата.
Я использую System.Linq и System.Linq.Expressions –
@TobiasOlofsson вы видели редактирование об удалении 'Expression'? Однако я считаю, что ваш лучший выбор - уменьшить это до минимального *** запускаемого *** примера. Скорее всего, вы обнаружите проблему при ее уменьшении, но если вы не можете: люди смогут ее воспроизвести и исправить. –
В БД сообщение таблицы имеет отношение к отношению «один ко многим» к пользователю, я пытаюсь выбрать всех пользователей для сообщения из запроса IEnumerable, содержащего это сообщение. Model.user - это код сначала EF. –