Результат 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)>, как предложено в ответе Гуру Строна.

Другие вопросы по тегам