我有以下产品类:
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());