2

我正在尝试使用 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 外,所有字段的数据类型均为string 或char。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 

如何使用 lambda 表达式选择所有年份和季度小于“20132”的 Eps?

4

3 回答 3

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您在数据库中具有相同的行数,您将失去一些性能。

于 2013-06-26T19:28:31.063 回答
0
var myData = myTable
    .Where(t => t.Comp.Equals("IBM")
        && (( Convert.ToInt32(t.Year) ==2013 && t.Quarter<2) || Convert.ToInt32(t.Year)<2013 ));
于 2013-06-26T19:31:29.163 回答
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 );
于 2013-06-26T19:25:22.633 回答