2016-09-26 81 views
1

之前處理數據我有一個表達的表達式樹需要返回

DateTime date = DateTime.Now; 
Expression<Func<MyClass, bool>> exp = null; 

我的目標應該是這樣的

exp = x => x.Year > date.Year 

可惜MyClass.Year領域是一個字符串,我需要解析它。在EF將值轉換爲sql時,我遇到了Convert.ToInt32(x.Year)的問題。如何將int.Parse操作轉換爲EF正確的sql語句? 有沒有辦法做這樣的事情?

exp = x => 
{ 
    int val = int.Parse(x.Year); 
    return val > date.Year 
} 

有一個變通,以這樣做只是爲了正確地編譯它,但仍然在尋找其他的方式,EF不能使用這些呼叫轉換成SQL:

private bool GetExpression(MyClass myClass, DateTime endDate) 
{ 
    int year = 0; 
    var res = int.TryParse(myClass.Year, out year); 

    if (res) 
     return year > endDate.Year; 

    return false; 
} 

exp = x => GetExpression(x, DateTime.Now) 
+0

與'x => int.Parse(x.Year)> date.Year'有什麼不同?你有沒有嘗試過'(int)x.Year'?另外,不要扮演魔鬼的擁護者,但是幾年應該按照字符串順序排列,至少在我們達到10000年之前。 – Luaan

+0

'SqlFunctions :: StringConvert' –

+0

我嘗試了兩個部分,我把年份命名爲字段,可以是金額。事情是當我試圖使用這樣的事情是失敗exp = x => Convert.ToInt32(x.Year)> = startDate.Year。然後我懷疑如何在LINQ語句中做到這一點 – Zinov

回答

-1

你可以改變你變量字符串,並使用string.Compare這樣的:

DateTime date = DateTime.Now; 
string dateString = date.ToString(); 

Expression<Func<MyClass, bool>> exp = 
    x => string.Compare(x.Year, dateString) > 0; 

這將返回相同的結果,只要你年都是4個字符

+0

比較基於字符串比較而不是數字比較 – Zinov

+0

@Zinov - 這是一個問題嗎?如果是這樣,請在比較失敗的地方發佈數據示例。可能還有其他方法。 – Aducci

+0

@Aducci 1000小於5,如果你比較它們作爲字符串,而不是數字。 – Servy