Linq to Entities Group By issue

时间:2012-05-11 14:22:30

标签: c# linq linq-to-entities

我有一个销售数据库,在CountryCode列中记录销售商品的2个字符的国家/地区代码。在销售数据库中,没有数量列,基本上每行代表1次销售,以及与该销售相关的信息。

我能够展示畅销国家。这是我提出的linq查询:

List<TopSellingCountries> tsc = (from sale in Sales
                                 where sale.CountryCode != null
                                 group sale by sale.CountryCode into cc
                                 select new TopSellingCountries
                                 {
                                     CountryCode = cc.Select(c => c.CountryCode).FirstOrDefault(),
                                     CountryCount = cc.Count()
                                 }).OrderByDescending(c => c.CountryCount).Take(10).ToList();

当我将此输出到我的View时,我得到一个包含以下信息的表:

CountryCode | CountryCount
         US | 196
         IE | 168
         US | 99
         GB | 91
         IE | 57
         AU | 32
         GB | 22
         AU | 18
         CA | 17
         CA | 17

正如您所看到的,它似乎没有按国家/地区代码正确分组。有没有人有任何想法我怎么能克服这个?

编辑: 如果有人需要,以下是View中的代码:

<table class="normal">
    <tr>
        <th>Country Code</th>
        <th>Country Count</th>
    </tr>
    <% foreach (var item in Model.TopSellingCountries)
       { %>
    <tr>
        <td><%: item.CountryCode %></td>
        <td><%: item.CountryCount %></td>
    </tr>
    <% } %>
    </table>

3 个答案:

答案 0 :(得分:1)

使用

CountryCode = cc.Key,

而不是

CountryCode = cc.Select(c => c.CountryCode).FirstOrDefault(),

同样修剪CountryCode可以防止这样的问题:

这样:

group sale by sale.CountryCode.Trim() into cc

答案 1 :(得分:1)

确保从CountryCode

中删除多余的空格
List<TopSellingCountries> tsc = (from sale in Sales
                                 where sale.CountryCode != null
                                 group sale by sale.CountryCode.Trim() into cc
                                 select new TopSellingCountries
                                 {
                                     CountryCode = cc.Key,
                                     CountryCount = cc.Count()
                                 })
                                 .OrderByDescending(c => c.CountryCount)
                                 .Take(10)
                                 .ToList();

答案 2 :(得分:0)

请尝试使用以下

List<TopSellingCountries> tsc = (from sale in Sales
                                 where sale.CountryCode != null
                                 group sale by sale.CountryCode into cc
                                 order by cc.Count() descending
                                 select new TopSellingCountries
                                 {
                                     CountryCode = cc.Key,
                                     CountryCount = cc.Count()
                                 }).Take(10).ToList();