c# – 通过使用LINQ跳过空值将Dictionary转换为Dictionary

我有以下产品类:

public class Product
{
    public string Name { get; set; }
    public float Price { get; set; }     
    public int? CategoryId { get; set; }
}

现在我必须计算每个CategoryId的产品数量,并将它们放在Dictionary< int,int>中.因此:

IQueryable<Product> products = _productServices.GetAll(); //return IQueryable<Product>

Dictionary<int, int> productDict =  products.ToList()
                                            .GroupBy(p => p.CategoryId)
                                            .ToDictionary(pgroup => pgroup.key, pgroup => pgroup.Count());

问题是我获得了一个Dictionary< int?,int>来自ToDictionary().即使我通过放置Where(p => p.CategoryId!= null)预过滤空值,我也不会将CategoryId的类型更改为int.我还尝试创建和匿名类型:

products.ToList()
        .GroupBy(p => p.CategoryId)
        .Select(p => new { p.key ?? -1, p.Count() }  
        .ToDictionary(pgroup => pgroup.key, pgroup => pgroup);

但它给出了无效的匿名类型成员声明符错误.我也尝试删除ToList()但没有运气.我稍微谷歌了,我没有发现任何人有这个问题,虽然我认为这种情况可能很频繁,特别是在使用EF和数据库时.有人有解决方案吗?

解决方法:

那是因为CategoryId是可以为空的.所以你需要先选择它的Value属性:

products.ToList()
        .Where(p => p.CategoryId.HasValue)
        .Select(p => p.CategoryId.Value)
        .GroupBy(i => i)
        .ToDictionary(g => g.Key, g => g.Count());
上一篇:JQuery ajax request及Java服务端乱码问题及设置


下一篇:c# – 如果为null,则DateTime.Parse采用最小日期值