我正在尝试让这个排序算法与IQueryable.OrderBy()一起工作。
https://www.dotnetperls.com/alphanumeric-sorting
我已经实现了AlphanumComparatorFast类,代码如下所示:
return this.DbContext.IssuesAccessView.AsQueryable()
.Include(r => r.Issue)
.Include(r => r.Issue.IssueAttachments)
.Include(r => r.Issue.IssueParticipants)
.Where(x => x.UserId == userId)
.Select(y => y.Issue)
.OrderBy(p => p.IssueNumber, new AlphanumComparatorFast()); 它编译得很好,但是Linq不知道在运行时与它有什么关系,因为它不能将AlphanumComparatorFast转换成SQL,所以我得到了这个错误。
“此方法无法转换为存储表达式。”
这里的关键是我不想失去IQueryable接口。我需要返回queryable,因为延迟执行。
所以我的问题是,有人能想出办法吗?我是否需要使用SQL函数(或类似的),还是可以使用IQueryable来完成?
谢谢!
更新
感谢CodeNotFound的回答,我确实需要创建一个SQL函数来完成这个任务。
我已经创建了一个函数,并试图首先从C# EF6代码(没有edmx文件)调用它,问题是我找不到如何这样做的好例子。我得到的最接近的是:
[Function(Name = "dbo.fn_CreateAlphanumericSortValue", IsComposable = true)]
[return: Parameter(DbType = "VarChar(100)")]
public string ReverseCustName([Parameter(Name = "string", DbType =
"VarChar(100)")] string @string)
{
return ((string)(this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())),
@string).ReturnValue));
}这里的问题是,这是从Linq到SQL,并且使用DataContext.ExecutMethodCall函数而不是EF 6中使用的DBContext对象,而且在DBContext中似乎没有等效的方法。
如能在EF6(代码优先,没有.edmx文件)中提供任何帮助,将不胜感激。
发布于 2017-08-24 21:22:44
您有以下错误
“此方法无法转换为存储表达式。”
因为您的查询必须转换为SQL指令,所以在SQL中没有可用的子句可以用AlphanumComparatorFast映射。
我是否需要使用SQL函数(或类似的函数),还是可以使用IQueryable来完成?
是的,您需要通过在服务器端创建一个SQL函数来转换用C#编写的排序逻辑,并在Linq中使用它来执行查询。
https://stackoverflow.com/questions/45871001
复制相似问题