计算LINQ to Dataset中的Group Ordinal

时间:2012-11-08 18:19:45

标签: ado.net linq-to-dataset

我有一个旧的FoxPro程序,它执行SQL查询,其中包括以下内容:

            SELECT  Region,                        
                    Year AS yr_qtr,                  
                    SUM(Stock) AS inventory   

... **

                   COUNT(Rent) AS rent_ct     
            FROM                                         

... **

            GROUP   BY Region, Year           
            ORDER   BY Region, Year
            INTO    CURSOR tmpCrsr

该查询针对.DBF表文件,并包含来自Excel文件的数据。我已经使用它们来填充我的C#程序中的用户定义对象的枚举。 (不确定。是否需要。)然后,我尝试使用LINQ to Dataset查询用户对象列表并创建相同的结果集:

var rslt1 = from rec in recs_list //.AsEnumerable()
            group rec by new {rec.Region, rec.Year} into grp
            select new
{
    RegName = grp.Key.Region,
    yr_qtr = grp.Key.Year,
    inventory = grp.Sum(s => s.Stock),
    // ...
    rent_count = grp.Count(r => r.Rent != null)
};

这给了我警告“表达式的结果始终为'true',因为'decimal'类型的值永远不等于'decimal'类型的'null'” Rent列的Count()。

这是有道理的,但是我如何进行计数,不包括值为.NULL的行。对于FoxPro表中的那一列(或任何SQL数据库表中的NULL,就此而言)?我不能对十进制值进行空测试。

1 个答案:

答案 0 :(得分:1)

如果租金是基于可空值的列,那么检查null是没有意义的,我相信编译器会准确显示。将行更改为

rent_count = grp.Count(r => r.Rent != 0)

代替。

如果代码是可以为空的,例如:

Decimal? rent; 

这将使检查租金对null有效。如果是这种情况,那么该行将是:

rent_count = grp.Count(r => (r.Rent ?? 0) != 0)

其中null coalesding operator ??可以使用。如果r.rent为null,则表示r.Rent使用值0(或技术上您想要的任何值)。在下一个过程中。