【问题标题】:Group by name in MVC foreach loop to get a count在 MVC foreach 循环中按名称分组以获取计数
【发布时间】:2021-01-26 03:21:36
【问题描述】:

以下代码是我当前在剃刀视图中运行的代码。

@foreach (var item in Model.intbyAnalysts.Select(x => x.Name).Distinct())
{
    <li>
        @Html.DisplayFor(x => item)
    </li>

}

这让我找回了我需要的名字。我想知道是否有任何方法可以对此进行计数,以便它可以让我返回名称列表并计算记录数,如下所示:

    John 5 
    Sam  6 
    Mary 8 
    etc

它不起作用,但我在想像下面这样的事情:

@foreach (var item in Model.intbyAnalysts.GroupBy(x => x.Name)) {
    <td>
    @Html.DisplayFor(x => x.item))
    </td>    
    <td>
     @Html.DisplayFor(x => x.item.Count())
    </td>      
}

再一次,这不起作用,但我也在想类似下面的事情:

@foreach (var item in Model.intbyAnalysts.GroupBy(x => x.Name)
                                          .Select(n => new {n.Name, n.Count }))

非常感谢任何帮助工作。

【问题讨论】:

  • 您的问题与 MVC 或 Razor 无关。您只需要创建一个模型 IEnumerable 并将其传递给视图。你为什么使用“DisplayFor”,当你说“它不起作用”时——什么不起作用?
  • 我想知道是否可以在不制作另一个模型的情况下在 linq 查询中做到这一点。关于 DisplayFor,我不熟悉使用剃须刀页面,因此不确定显示结果的最佳方式是什么。
  • 只需使用@符号然后指定数据源,如@Model.Items[0]等。创建单独的模型总是好的......

标签: c# asp.net-mvc linq razor


【解决方案1】:

将 Linq 逻辑移动到模型类而不是将其放在视图中...

这对我有用,我认为不需要解释这个简单的代码:

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp
{
    public class Program
    {
        public static void Main()
        {
            var model = new Model();
            model.Items.Add( new Item { Name = "item1" } );
            model.Items.Add( new Item { Name = "item1" } );
            model.Items.Add( new Item { Name = "item1" } );
            model.Items.Add( new Item { Name = "item2" } );
            model.Items.Add( new Item { Name = "item2" } );
            model.Items.Add( new Item { Name = "item3" } );

            foreach (var entry in model.ItemNameAndCount)
            {
                Console.WriteLine( entry.name + ": " + entry.count );
            }
        }

        public class Model
        {
            public List<Item> Items { get; set; } = new List<Item>();

            public IEnumerable<(string name, int count)> ItemNameAndCount
               => Items.GroupBy( x => x.Name )
                       .Select( group =>
                            (
                              name: group.Key,
                              count: group.Count()
                            )
                        );
        }

        public class Item
        {
            public string Name { get; set; }
        }
    }
}

【讨论】:

  • 为什么在 Count 中需要 item.Name == group.Key 谓词?无论如何,这个计数只会返回当前组中的项目数。
【解决方案2】:

一切似乎都很好,除了它应该是@Html.DisplayFor(x =&gt; x.item.Key)) 在第一个td(不仅仅是x.item)。

这能解决您的问题吗?如果没有,您能否用一些错误详细信息更新问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多