2014-11-20 101 views
2

我存儲在我的數據庫郵政編碼,並試圖下面的T-SQL轉換爲LINQ到實體比較:字符串在LINQ到實體

SELECT * 
FROM Regions 
WHERE EndZip >= '12345' 

我試圖像下面的代碼:

var result = this.DbContext.Regions.Where(e => e.EndZip.CompareTo("12345") >= 0); 

但我得到一個EntityCommandExecutionException:「二進制運算符GreaterThanOrEqual沒有爲'System.String'和'System.String'類型定義。」

我能夠做到這一點,如果我將我的IQueryable轉換爲IEnumerable,但我希望這個查詢在SQL中執行的性能原因。

有誰知道我可以如何比較LINQ到實體的字符串?

+0

您是否在嘗試查找大於指定郵政編碼的郵政編碼?試圖瞭解目標。 – CmdrTallen 2014-11-20 18:38:41

+0

這是正確的。我們正在存儲具有郵政編碼範圍的記錄,並試圖查找給定郵政編碼落在記錄範圍內的記錄。 – jawang35 2014-11-20 18:39:45

+0

我相信你的實際問題是試圖使用'String'的'CompareTo'方法,這是LINQ to Entities不支持的。 – galenus 2014-11-20 18:40:10

回答

1

Linq to Entities支持一組有限的函數。 字符串比較是有限的。

Linq to entity Docu 然後看到裏面的鏈接 Supported Linq to Entity functions

的介紹說,大部分

本節提供有關支持或不支持的語言集成查詢(LINQ)標準查詢運算符的信息LINQ to Entities查詢。許多LINQ標準查詢運算符都有一個接受整數參數的重載版本。整數參數對應於正在操作的序列中的從零開始的索引,IEqualityComparer或IComparer。除非另有說明,否則LINQ標準查詢操作符的這些重載版本不受支持,試圖使用它們將引發異常。

0

雖然我會,在一般情況下,考慮治療郵編爲數字(而不是作爲一個字符串),是做一個特定的令人髮指的事情,在這種情況下,它似乎工作:

from e in DbContext.Regions 
where Convert.ToInt32(a.EndZip) >= 12345 
select e 

UPDATE:

由於將有加拿大郵政編碼(我們假定我們不希望在我們的 「> = 12345」 的搜索結果:

from e in DbContext.Regions 
where DbContext.IsNumeric(a.EndZip) && Convert.ToInt32(a.EndZip) >= 12345 
select e 

爲了得到那個工作,你需要讓LINQ的瞭解則IsNumeric現在

partial class MyDataContext 
{ 
    [Function(Name = "ISNUMERIC", IsComposable = true)] 
    public int IsNumeric(string input) 
    { 
     throw new NotImplementedException(); // this won't get called 
    } 
} 

,當然,如果你想參與搜索加拿大碼(例如那麼你有一個全新的問題,我沒有看到任何明顯的答案,但是如果你可以限制自己僅僅通過第一個字符進行分割(即>= '20000'),那麼你可以做這樣的事情:

from e in DbContext.Regions 
    where e.EndZip[0] >= '2' 
    select e; 
+0

不幸的是,我們還存儲了一些國際郵政編碼,如加拿大,其中包括字母:T – jawang35 2014-11-20 21:46:17