0

我有一个旧的 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# 程序中填充用户定义对象的枚举。(不确定是否需要 .AsEnumerable。)然后我尝试使用 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,就此而言)?我不能对十进制值进行空测试。

4

1 回答 1

1

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

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

反而。

如果代码实际上可以为空,例如:

Decimal? rent; 

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

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

空合并运算符在哪里?可以使用。如果 r.rent 为空,请使用值 0(或技术上您想要的任何值)作为 r.Rent。在接下来的过程中。

于 2012-11-08T18:49:07.347 回答