如何在 EntityFrameworkCore 中使用 Difference 函数?

How to use Difference function in EntityFrameworkCore?

我要执行这个查询:

Select * From Products WHERE Title like '%search text%' 
ORDER BY Difference(Title, 'search text') DESC

现在我想使用 EntityFrameworkCorelinq 来实现上述查询。

那么如何调用差异函数来按标题列中最接近的匹配项订购产品?

SQL看不懂c#写的Difference函数。要使其正常工作,您必须从 c# collection like List

中的 Products table 获取值

然后使用 Difference 函数

对该列表进行排序

每个 IQueryable 都有一个 Expression 和一个 ProviderExpression 包含必须执行的查询。 Provider 知道谁必须执行查询,通常是数据库管理系统。 Provider 的任务是将 Expression 翻译成数据库可以理解的语言(类似 SQL 的语言)并执行查询。 Provider 将以高效的方式获取结果,并且 return 将查询的数据作为可枚举对象。

IQueryable 实现 IEnumerable

当您使用 ToList()FirstOrDefault()Any() 等 LINQ 函数或在 foreach 中使用查询时,会在内部调用 IEnumerable.GetEnumerator()Enumerator.MoveNext()

这将命令 ProviderExpression 翻译成 SQL 并执行查询。 returned 枚举用于枚举 returned 项。

实现 IQueryable 的 class 程序员的任务是实现 Expression 到 SQL 的翻译。这并不容易,我认为创建 entity framework 的人做得很好。

但是,SQL 中已知的一些项目很难实施。其中包括 SoundEx 和 Difference 的概念。我不确定,但我认为造成困难的原因之一是它们通常用于 SQL,而不是用于任何其他类型的 IQueryable 系统。

事实上,entity framework 不支持一些功能。参见 Supported and unsupported LINQ methods (LINQ to entities)

您的 DbContext 是数据库模型的抽象表示。它的用户不应该关心它是否使用 Microsoft SQL、MySQL,或者它是否是一个不使用任何类似于 SQL.

的数据集合

但是,如果您完全确定可以将 DbContext 限制为仅适用于某种类型的数据库(了解 SoundEx 和 Difference 的概念),请考虑为您的查询创建一个存储过程。参见 How to call a Stored Procedure in Entity Framework