2017-08-24 120 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#調用它。添加上述問題的更新。 –