2012-05-18 40 views
1

長話短說我需要根據範圍(高/低值)獲取項目,但數據庫中的列/屬性爲string,而我的不允許允許更改那。那麼我該如何比較一個範圍呢?比較實體框架中的字符串編號範圍

我似乎無法找到一種方法來將實體屬性轉換爲int,所以我可以比較。 當然Convert.toInt32也不起作用。我沒有看到任何SqlFunctions這將幫助,但也許我忽略了一些容易。

我一直在玩它,但到目前爲止沒有運氣。這是我的最新嘗試不起作用:

var result = Repo.Query().Where(e => e.SerialNumber.Cast<int>().First() >= myIntLowVariable && e.SerialNumber.Cast<int>().First() <= myIntHighVariable); 

有什麼建議嗎?

更新

用戶輸入兩個SerialNumbers,我需要在這個範圍內返回所有的記錄,但是SerialNumberstring/varchar列/屬性。

數據 - 對不起不知道如何把一個表在這裏..

SN ::說明
1 ::牛奶
2 ::雞蛋
3 ::麪包
4 ::奶酪
5 ::培根
6 ::酸奶
7 ::芥末
8 ::雞
9 ::披薩
10 ::籌碼

+0

什麼樣的字符串存儲在你的數據庫中?它是一種固定的格式?一些例子將有助於獲得更好的答案。 –

+0

你能舉幾個例子的數據請 –

+0

最大位數是多少?構建一個查看長度的查詢並根據每個1,2,3,...數字進行比較是否可行?或者,將零填充固定爲固定長度並將其作爲字符串進行比較? –

回答

2

如果您在查詢中調用ToList(),那麼您應該可以將您的字符串轉換爲Int32。

var result = Repo.Query().ToList().Where(e => e.StringNumberField.Cast<int>().First() >= myIntLowVariable && e.StringNumberField.Cast<int>().First() <= myIntHighVariable); 

如果不能投影整個查詢,那麼你可以做到以下幾點:

在你創建一個存儲過程分貝,做過濾。類似這樣的事情可以做到:

CREATE PROCEDURE spGetStuffBetween 
(
    @min int, 
    @max int 
) 
AS 
BEGIN 
    SELECT * from dbo.Stuff where Convert(int, SerialNumber) < @max and Convert(int, SerialNumber) > @min; 
END 

使用EDM工具,使用新添加的存儲過程從數據庫更新模型。在「添加」下,選擇剛剛創建的存儲過程,然後選擇「完成」。

更新模型後,您將無法看到存儲過程,因此請右鍵單擊設計圖面並選擇「模型瀏覽器」。您將能夠在Stored Procedures節點下看到它。

雙擊模型瀏覽器中的存儲過程。在這裏您可以指定從存儲過程返回的集合的類型。

現在,您可以撥打下面的代碼,以獲得您想要的結果:

int myIntLowVariable = 1000; 
int myIntHighVariable = 1000000; 

var results= Repo.spGetAnimalsBetweenRange(myIntLowVariable , myIntHighVariable); 
+0

對不起,我不能把所有的數據都放到內存中。有許多記錄。 – MisterIsaak

+0

更新了使用存儲過程和EF的解決方案。 –

+0

感謝您更新的答案,我最終以一個像你所建議的存儲。由於業務邏輯基本上是批量更新,因此無論如何它可能是最好的。 – MisterIsaak

1

右鍵使用應答here對準前導零的字符串和做同樣與您輸入的字符串,現在你可以做字母比較所需的範圍。

您也可以嘗試this question中的方法。

+0

我很喜歡第二個鏈接選項,但我無法使它工作。當我有時間的時候,我決定更多地研究它。我不知道存在模型定義的函數。謝謝! – MisterIsaak