将 EF Core 7 结果投影到命名元组

lon*_*nix 6 c# entity-framework-core .net-7.0 ef-core-7.0

我正在使用 EF Core 7。我想执行服务器评估并项目到命名元组。

我试过:

var products = await _context.Products.Select(x => (x.Id, x.Name)).ToListAsync();
Run Code Online (Sandbox Code Playgroud)

这使:

表达式树可能不包含元组文字。

我可以使用常规元组 ( Tuple.Create()) 或匿名对象 ( new {}) 来完成此操作,但如果可能的话,我想使用命名元组。

这可以以某种方式完成吗?

Gur*_*ron 7

不,目前这是不可能的,因为不可能在表达式树中使用值元组文字。您可以在 github 上监控以下问题/讨论:

如果您真的非常想使用值元组,唯一的方法是在查询具体化后映射到它们,但我认为在大多数情况下这是毫无意义的。像下面这样:

var products = _context.Products
   .Select(x => new {x.Id, x.Name})
   .AsEnumerable()
   .Select(ac => (ac.Id, ac.Name))
   .ToList();
Run Code Online (Sandbox Code Playgroud)

虽然方法间接有一个可以使用的技巧:

class SomeClass // local functions can't be used
{
    public static (int Id, int Name) CreateNamedValueTuple(int t1, int t2) => (t1, t2);
}

var products = await _context.Products
    .Select(x => SomeClass.CreateNamedValueTuple(x.Id, x.Name))
    .ToListAsync();
Run Code Online (Sandbox Code Playgroud)

但就我个人而言,我只会使用 C# 9记录功能,该功能允许轻松创建类型(或 C# 10记录结构)。