首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IQueryable与AlphaNumeric排序

IQueryable与AlphaNumeric排序
EN

Stack Overflow用户
提问于 2017-08-24 21:15:30
回答 1查看 412关注 0票数 1

我正在尝试让这个排序算法与IQueryable.OrderBy()一起工作。

https://www.dotnetperls.com/alphanumeric-sorting

我已经实现了AlphanumComparatorFast类,代码如下所示:

代码语言:javascript
复制
           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文件)调用它,问题是我找不到如何这样做的好例子。我得到的最接近的是:

代码语言:javascript
复制
[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文件)中提供任何帮助,将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2017-08-24 21:22:44

您有以下错误

“此方法无法转换为存储表达式。”

因为您的查询必须转换为SQL指令,所以在SQL中没有可用的子句可以用AlphanumComparatorFast映射。

我是否需要使用SQL函数(或类似的函数),还是可以使用IQueryable来完成?

是的,您需要通过在服务器端创建一个SQL函数来转换用C#编写的排序逻辑,并在Linq中使用它来执行查询。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45871001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档