2014-10-10 104 views
0

我在網上檢查了一些答案,並且我瞭解到我無法將ToInt32轉換爲T-SQL,並且我需要使用運行我的查詢先記住內存,然後再進行轉換,但我不知道如何將其應用於我的示例中。我有下面的查詢,它顯示了我寫在標題中錯誤消息:LINQ to Entities不能識別方法'Int32 ToInt32(System.String)'方法

string[] parts = rvm.ZipCode.Split('-'); 
var list = results.OrderBy(b => 
    Math.Abs(Convert.ToInt32(parts[0]) - Convert.ToInt32(b.Zip))).Take(5).ToList(); 

哪裏results是另一個查詢,我之前應用。任何想法如何解決它?

+0

從我的理解,你需要將它轉換爲int32在本地變量* first *,然後將其提供給您的LINQ查詢。這讓我懷疑你是否將整個轉換部分包含在括號中,編譯器是否會首先處理它?值得一試。如果沒有,只需製作一個int32的局部變量,並將其提供給LINQ。 – Jason 2014-10-10 13:10:16

回答

1

你可以嘗試這樣的事:

// It would be better, if we make the conversion only once instead of 
// doing this each time we fetch an item from our collection. 
int value = Convert.ToInt32(parts[0]); 

var list = results.AsEnumerable() 
        .OrderBy(z => Math.Abs(value - Convert.ToInt32(z.Zip))) 
        .Take(5) 
        .ToList(); 
2

調用AsEnumerable()將迫使它做排序內存:

var list = results.AsEnumerable().OrderBy(b => Math.Abs(Convert.ToInt32(parts[0]) - Convert.ToInt32(b.Zip))).Take(5).ToList(); 

這可能是非常ineficient雖然作爲數據已經從數據庫中檢索後Take(5)會發生,所以你取的整個結果集放入內存中,對它進行排序,然後丟棄除前5條記錄以外的所有記錄。

0

LINQ2SQL和Linq2Entity總是試圖查詢傳遞到數據庫和大多數數據庫不具有相同的功能Convert類。這意味着要應用轉換函數,您需要指示linq從數據庫中檢索數據,以便它可以運行代碼而不是將其傳遞到數據庫。

,這是通過實例化查詢調用轉換功能

另一選擇是將其更改爲一個簡單的轉換,如(INT)或之前完成致電AsEnumerable()或ToList()作爲int?因爲這些都有直接的數據庫映射

相關問題