3

我有以下Product课程:

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

Product现在我必须计算每个人有多少个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)我也不会将类型更改CategoryIdint。我还尝试创建匿名类型:

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

但它给出了一个Invalid anonymous type member declarator错误。我也试图删除ToList()但没有运气。我用谷歌搜索了一下,没有发现有人遇到这个问题,尽管我认为这种情况可能很常见,尤其是在使用EFdatabases时。有人有解决方案吗?

4

4 回答 4

7

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

products.ToList()
        .Where(p => p.CategoryId.HasValue)
        .Select(p => p.CategoryId.Value)
        .GroupBy(i => i)
        .ToDictionary(g => g.Key, g => g.Count());
于 2012-11-19T10:12:05.350 回答
5

只需使用

products.ToList()
    .GroupBy(p => p.CategoryId)
    .Where(pgroup => pgroup.Key.HasValue)
    .ToDictionary(pgroup => pgroup.Key.Value, pgroup => pgroup.Count());
于 2012-11-19T10:10:44.153 回答
4

这个怎么样?

.ToDictionary(pgroup => pgroup.Key ?? -1, pgroup => pgroup.Count());

关于匿名类型的语法错误,正确的语法如下:

.Select(p => new { Key = p.Key ?? -1, Count = p.Count() })
于 2012-11-19T10:10:03.390 回答
0

您需要过滤掉空值,然后使用 的.Value属性int?作为分组键:

products.ToList()
        .Where(p => p.CategoryId.HasValue)
        .GroupBy(p => p.CategoryId.Value)
        .ToDictionary(pgroup => pgroup.key, pgroup => pgroup.Count());
于 2012-11-19T10:11:59.827 回答