如何在EntityFrameworkCore中使用Difference函数?

时间:2018-10-16 07:24:32

标签: 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 来实现上述查询。

那么如何调用差值函数以按“标题”列中的最接近匹配顺序订购产品?

2 个答案:

答案 0 :(得分:1)

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

IQueryable实现IEnumerable

当您使用ToList()FirstOrDefault()Any()之类的LINQ函数或在foreach中使用查询时,内部将调用IEnumerable.GetEnumerator()并{ {1}}

这将命令Enumerator.MoveNext()Provider转换为SQL并执行查询。返回的枚举用于枚举返回的项目。

实现Expression的类的程序员的任务是实现IQueryable到SQL的转换。这并不容易,我认为创建实体框架的人做得很好。

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

实际上,实体框架不支持某些功能。参见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

答案 1 :(得分:0)

SQL无法理解用c#编写的Difference函数。要使其正常工作,您必须从c# collection like List

的“产品”表中获取值

然后使用Difference函数对该列表进行排序