我有一个旧的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,就此而言)?我不能对十进制值进行空测试。
答案 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(或技术上您想要的任何值)。在下一个过程中。