.NET 6 带有实体框架的新 LINQ 功能

Posted

技术标签:

【中文标题】.NET 6 带有实体框架的新 LINQ 功能【英文标题】:.NET 6 New LINQ Features with Entity Framework 【发布时间】:2022-01-12 12:06:19 【问题描述】:

在 .NET 6 中有一些不错的新 LINQ 扩展方法,例如

var oldest = context.People.MaxBy(p => p.Age);

但是,EF 提供程序似乎还不支持这些功能(当然不是 SQLite 或 SQLServer,都是 6.0.0 版本)。

有谁知道这些提供商计划何时提供这些服务?

【问题讨论】:

他们在Queryable上不可用吗? @ErmiyaEskandary 它们在界面上可用,但由提供者实现。 SQL 中的等价物是什么? LINQ 被翻译成 SQL ,所以它不能做任何在 SQL 中不可能的事情。 LINQ 不会自行运行,它会被转换为 SQL。所有执行与MaxBy 等效的查询的成本都很高。 select * from Table1 where field=(select max(field) from Table1) 很昂贵,即使 field 被索引覆盖。如果不是,它非常很贵。使用ROW_NUMBER 也很昂贵,但也许只需一次表扫描即可获得结果——前提是索引恰到好处。 select top 1 * from Table1 order by field desc 也需要排序。 相关对象会发生什么? 【参考方案1】:

目前,EF Core 不支持它们(至少 EF Core 团队提供的提供程序不支持),团队正在调查 7.0 中的支持情况。见thisgithub问题。

还有this issue 了解其他新的 LINQ 功能。

【讨论】:

不要期望太多。关键字是reasonable translations.。数量不多,而且都很贵。然后就是加载相关实体的问题

以上是关于.NET 6 带有实体框架的新 LINQ 功能的主要内容,如果未能解决你的问题,请参考以下文章

ADO.NET 实体框架 - 带有实体框架 6 的 Oracle

在带有 Linq 的实体框架中使用 LIKE "%%%"? [复制]

实体框架 Linq 查询:.Where 链 vs &&

使用 linq 查询和实体框架进行检索

实体框架探查器 - 带有 EF 6 的 ASP.NET MVC4 - 无法确定提供程序名称

带有 Mysql 和 NullReferenceException 的实体框架 6