2017-08-24 126 views
1

我试图让这个排序算法0​​工作:IQueryable的带字母排序

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。我需要返回查询延迟执行。

所以我的问题是,任何人都可以想办法做到这一点?我是否需要使用SQL函数(或一些这样的),或者可以使用IQueryable来完成?

谢谢!

UPDATE

感谢CodeNotFound回答,我确实需要创建一个SQL函数来做到这一点。

我已经创建了一个函数,并试图从C#EF6 Code First(无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 to SQL和使用DataContext.ExecutMethodCall功能,而不是在EF 6中使用的DBContext对象,并似乎在DBContext没有等效方法

如何做到这一点EF6任何帮助(代码第一,没有的.edmx文件),将不胜感激

回答

4

,您对以下错误

“此方法无法转换为商店表达式。”

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

我是否需要使用SQL函数(或其他)或可以使用IQueryable来完成 ?

是的,你需要翻译用C#编写的用SQL编写的排序逻辑,方法是在服务器端创建一个SQL函数,并在你的Linq to Entites查询中使用它。

+0

我想的很多。我现在有一个SQL函数来完成排序,但是还没有找到一个很好的例子来说明如何使用EF 6 Code First从C#调用它。添加上述问题的更新。 –