LINQ / LAMBDA按日期过滤查询

时间:2013-06-26 19:22:25

标签: c# linq linq-to-sql lambda

我正在尝试使用LINQ to SQL来检索特定日期范围的收入数据。目前该表的设置如下:

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 

如何选择所有具有年份和年份的Eps?使用lambda表达式小于“20132”的四分之一?

3 个答案:

答案 0 :(得分: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的行数,您将失去一些性能。

答案 1 :(得分: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 );

答案 2 :(得分:0)

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