문제

I have an old FoxPro program that does a SQL query which includes the following:

            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

The query is against a .DBF table file, and includes data from an Excel file. I've used both to populate an enumeration of user-defined objects in my C# program. (Not sure .AsEnumerable is needed or not.) I then attempt to use LINQ to Dataset to query the list of user objects and create the same result set:

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)
};

This gives me the warning that "The result of the expression is always 'true' since a value of type 'decimal' is never equal to 'null' of type 'decimal'" for the Count() of the Rent column.

This makes sense, but then how do I do a count exclusive of the rows that have a value of .NULL. for that column in the FoxPro table (or NULL in any SQL database table, for that matter)? I can't do a null test of a decimal value.

도움이 되었습니까?

해결책

If rent is based off of a column which is not a nullable value, then checking for null makes no sense which I believe the compiler accurately shows. Change the line to

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

instead.

For if the code is actuall nullable such as:

Decimal? rent; 

That would make checking rent against null valid. If that is the case then the line would be:

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

where null coalesding operator ?? can be used. Which states if r.rent is null, use the value 0 (or any value you want technically) for r.Rent. in the next process.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top