Sql server 如何在EntityFrameworkCore中使用差分函数?
我要执行以下查询:Sql server 如何在EntityFrameworkCore中使用差分函数?,sql-server,linq,entity-framework-core,sql-function,Sql Server,Linq,Entity Framework Core,Sql Function,我要执行以下查询: Select * From Products WHERE Title like '%search text%' ORDER BY Difference(Title, 'search text') DESC 现在我想使用EntityFrameworkCore和linq实现上述查询 那么,我如何调用difference函数来按标题列中最接近的匹配订购产品呢?SQL无法理解用c#编写的difference函数。要使其工作,您必须从c#类集合列表中的Products表中获取值 然
Select * From Products WHERE Title like '%search text%'
ORDER BY Difference(Title, 'search text') DESC
现在我想使用EntityFrameworkCore和linq实现上述查询
那么,我如何调用difference函数来按标题列中最接近的匹配订购产品呢?SQL无法理解用c#编写的
difference
函数。要使其工作,您必须从c#类集合列表中的Products表中获取值
然后使用Difference
函数对该列表进行排序每个IQueryable
包含一个表达式
和一个提供者
。表达式包含必须执行的查询。提供者
知道谁必须执行查询,通常是数据库管理系统。提供者的任务是将表达式
翻译成数据库能够理解的语言(类似SQL)并执行查询。提供程序
将以有效的方式获取结果,并将查询的数据作为可枚举对象返回
IQueryable
实现IEnumerable
当您使用LINQ函数,如ToList()
,FirstOrDefault()
,Any()
,或在foreach
中使用查询时,会在内部调用IEnumerable.GetEnumerator()
,并调用Enumerator.MoveNext()
这将命令提供程序
将表达式
转换为SQL并执行查询。返回的可枚举项用于枚举返回的项
实现IQueryable
的类程序员的任务是将表达式
转换为SQL。这并不容易,我认为创建实体框架的人做得很好
但是,SQL中已知的某些项很难实现。其中包括SoundEx和Difference的概念。我不确定,但我认为造成这一困难的原因之一是它们通常用于SQL,而不是任何其他类型的IQueryable系统
事实上,实体框架不支持一些功能。看
DbContext是数据库模型的抽象表示。它的用户不应该关心它是否使用MicrosoftSQL、MySQL,或者它是否是一个不使用任何类似SQL的数据收集
<>但是如果你绝对确定将你的数据库上下文限制为某种类型的数据库,一个知道SoNexx和差异的概念,考虑为你的查询创建一个存储过程。如果我有一个匹配1000种产品的查询,请参见。这是否意味着我需要获取它们并将它们作为内存集合进行排序?因此,我必须执行存储过程来执行上面的查询,该查询使用SoundEx和Difference。如果您想使用SQL Difference,那么显然您需要这样做。另一种可能是在不进行排序的情况下获取数据,并使用本地差异函数进行排序。但我认为这样的函数将很难找到,特别是因为它没有严格指定它应该返回什么