2013-06-26 152 views
2

我正嘗試使用LINQ to SQL來檢索特定日期範圍的收入數據。目前該表設置如下:LINQ/LAMBDA過濾器按日期查詢

Comp Eps Year Quarter 
IBM  .5  2012 2 
IBM  .65 2012 3 
IBM  .60 2012 4 
IBM  .5  2011 2 
IBM  .7  2013 1 
IBM  .8  2013 2 

除Eps之外,所有字段都有一個字符串或字符的數據類型。 Eps的數據類型爲double。 這裏是我的代碼:

var myData = myTable 
    .Where(t => t.Comp.Equals("IBM") 
     && 
     Convert.Int32(string.Format("{0}{1}", t.Year, t.Quarter)) <= 20131); 

我收到以下錯誤,當我嘗試過:

Method 'System.String Format(System.String, System.Object, System.Object)' has no supported translation to SQL 

我如何選擇具有不是「20132」少了一年&季度所有EPS使用lambda表達式?

+1

當前代碼有什麼問題? –

+0

我認爲他正在使用LINQ to SQL,在處理數據庫時不支持'string.Format()'方法。 –

回答

2

最好的解決辦法是改變數據庫架構,這樣YearQuarter將成爲整數。

如果這是不可能的 - 就像你說的 - 你可以通過使用.AsEnumerable()擴展方法運行內存的一半查詢:

var myData = 
    myTable.Where(t => t.Comp.Equals("IBM")) 
      .AsEnumerable() 
      .Where(Convert.Int32(string.Format("{0}{1}", t.Year, t.Quarter)) <= 20131); 

取決於與你有相同的Comp多少行你的數據庫你會失去一些性能。

+0

沒有權利這樣做。 :( –

+0

Bummer ...... –

+0

查看我編輯的答案 –

0

你可以試試這個:

var myData = myTable 
    .Where(t => t.Comp.Equals("IBM") 
     && (Convert.ToInt32(t.Year) < 2013 
      || (Convert.ToInt32(t.Year) == 2013 
       && Convert.ToInt32(t.Quarter) <= 2))); 

或者這樣:

var myData = myTable 
    .Where(t => t.Comp.Equals("IBM") 
     && String.Compare(t.Year + "" + t.Quarter, "20131") <= 0); 
0
var myData = myTable 
    .Where(t => t.Comp.Equals("IBM") 
     && ((Convert.ToInt32(t.Year) ==2013 && t.Quarter<2) || Convert.ToInt32(t.Year)<2013));