2017-04-09 37 views
0
finalProducts = context.Products.OrderBy(p => p.Name.LevenshteinDistance(query)) 
           .Skip(from) 
           .Take(36) 
           .ToList<Product>(); 

我用的方法編輯距離()找到匹配的查詢,但它顯示錯誤如何使用外部方法在LINQ排序依據

LINQ到實體無法識別方法「的Int32編輯距離(系統.String,System.String)'方法,並且此方法不能轉換爲商店表達式。

我應該怎麼做來使用此方法的數據庫產品進行排序?

+0

您正在使用哪個數據庫? – Evk

+0

@Evk我不確定這是否相關。沒有冒犯性,我只是想知道一些數據庫是否可以處理這些東西。 –

+0

[LINQ to Entities可能重複無法識別該方法](http://stackoverflow.com/questions/7259567/linq-to-entities-does-not-recognize-the-method) –

回答

0

你「想」創建一個查詢數據庫,使用最可能通過自己編寫的方法。但是,問題在於框架不知道如何將該方法轉換爲邏輯查詢。從數據庫中獲得結果後,您需要對結果進行排序。

0

您將需要訂購的內存列表:

var products = context.Products.ToList(); 
var finalProducts = products.OrderBy(p => p.Name.LevenshteinDistance(query)).Skip(from).Take(36).ToList<Product>(); 

...或重新寫你的方法的邏輯在存儲過程和執行這一個。 LINQ-to-Entities顯然不能將您的自定義C#方法轉換爲T-SQL。

+0

@Avrohom您的評論不夠清楚。你能解釋/重新說一下嗎? –

+1

我打電話ToList()方法來查詢數據庫,然後我訂購*內存*集合,所以我沒有看到你的觀點。 – mm8

+0

@Avrohom您的意見是自相矛盾的。調用'ToList()'在數據庫中執行查詢,返回的對象是C#對象,因此之後調用的方法都適用於C#對象,從而解決了這個問題。我也看不到你的觀點。 –

0

正如其他人評論說,問題是,你想在數據庫上運行你自己的方法。你不能這樣做,因爲數據庫不知道你的方法。

瞭解Linq2Enties查詢的工作是很重要的。在枚舉查詢之前,實際上沒有做任何事情。只有在枚舉查詢時(比如通過調用諸如ToList(),ToArray()或任何一個OrAbc()方法)的擴展方法,數據庫才能訪問數據並返回一些結果給代碼。此時,任何進一步的代碼都會獨立於數據庫運行,因此您可以調用自己的方法。

所以,你所能做的就是這個...

finalProducts = context.Products 
          .ToList<Product>() // Enumerates 
          .OrderBy(p => p.Name.LevenshteinDistance(query)) 
          .Skip(from) 
          .Take(36) 
          .ToList<Product>(); 

,將工作。但是,你需要知道這樣做的後果,因爲數據庫將返回產品,如果你有很多這可能需要一些時間。你必須嘗試一下,看看這對你是否有問題。

如果性能是一個問題,那麼你就可能要實現的距離函數作爲存儲過程,但是這是一個大量的工作。先試試這種方法。