我要执行此查询:
Select * From Products WHERE Title like '%search text%'
ORDER BY Difference(Title, 'search text') DESC
现在,我想使用 EntityFrameworkCore 和 linq 来实现上述查询。
那么如何调用差值函数以按“标题”列中的最接近匹配顺序订购产品?
答案 0 :(得分:1)
每个IQueryable
都有一个Expression
和一个Provider
。 Expression
保存必须执行的查询。 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
函数对该列表进行排序