Результат Project EF Core 7 для именованного кортежа
Я использую EF Core 7. Я хочу выполнить оценку сервера и спроецировать его на именованный кортеж.
Я пытался:
var products = await _context.Products.Select(x => (x.Id, x.Name)).ToListAsync();
Который дает:
Дерево выражений не может содержать литерал кортежа.
Я мог бы сделать это с помощью обычного кортежа (Tuple.Create()
) или анонимный объект (new {}
), но я хотел бы использовать именованный кортеж, если это возможно.
Это можно как-то сделать?
2 ответа
Нет, в настоящее время это невозможно, потому что нельзя использовать кортежи значений в деревьях выражений. Вы можете следить за следующими проблемами/обсуждениями на github:
Если вы действительно очень хотите использовать кортежи значений, единственный способ — сопоставить их после материализации запроса, но я бы сказал, что в большинстве случаев это довольно бессмысленно. Что-то вроде следующего:
var products = (await _context.Products
.Select(x => new {x.Id, x.Name})
.ToListAsync())
.Select(ac => (ac.Id, ac.Name))
.ToList();
Вы действительно можете использоватьValueTuple.Create()
в вашем выражении Select. EFCore поступит правильно.
var products = await _context.Products.AsNoTracking()
.Select(x => ValueTuple.Create(x.Id, x.Name))
.ToListAsync();
Конечно, вам придется инкапсулировать это в функцию, которая возвращает IEnumerable<(int Id, int Name)>, как предложено в ответе Гуру Строна.