[asp.net-mvc]通过 ASP.NET MVC 遍历嵌套的 LINQ 查询中的 C# 视图中的匿名对象

标签: Asp.net-MVC Linq
发布时间: 2017/3/25 3:35:47
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

通过 ASP.NET MVC 遍历嵌套的 LINQ 查询中的 C# 视图中的匿名对象

嗨,让我们做了很多的搜索和阅读但仍需要一些特定的信息。 我有以下代码︰

       List<DateTime> range = getRangeCollection();

        var range = (
             from years in rangeData 
             group years by years.Year 
             into yearsData 
             select new {
                 year = yearsData.Key,
                 months = (
                     from month in yearsData 
                     group month by month.Month 
                     into monthsData
                     select new {
                         month = monthsData.Key,
                         days = (
                             from days in monthsData
                             group days by days.Day
                             into daysData
                             select new {
                                 day = monthsData.Key, 
                                 days = daysData
                             })
                     })
             }).ToList();

我可以将某个视图发送这作为 ViewData 属性就像这样。

    <% foreach (var date in ((IEnumerable)ViewData["range"])) { 
// another foreach needed to access date.month and loop days inside.
 %> 
 <p><%=date%></p>
  <% } %>

但我想用它来生成 HTML,如下所示︰

2009
  January
    (all the days in jan)
  February
    (all the days in feb)
    ..ect
2010
  Janurary
    (all the days in jan)
  February
    ...ect

我不确定如果我 LINQ 是正确的但我想遍历结果在 ASP.NET MVC 的环境中。我试图把我的头周围 IEnumerable 和 IQueryable。我在正确的轨道上?

解决方法 1:

我认为你可能过分复杂化的解决方案,基于我认为你想要做什么。 最终它一定很酷,写一个小的类来处理这种类型的数据结构,要聚合基于年份和月份的日期。

我假设你想要离开出年 / 几个月,都是空的或您的日期范围是不可能有差距。 您还会注意到,我使用 IQueryable,而不是 IEnumerable。

基本上你需要到不同年在你的射程,然后不同年每个月。 因此,鉴于此数据集︰

List<DateTime> dateRange = new List<DateTime>();
dateRange.Add(new DateTime(2009, 5, 18));
dateRange.Add(new DateTime(2009, 5, 12));
dateRange.Add(new DateTime(2009, 6, 22));
dateRange.Add(new DateTime(2009, 2, 14));
dateRange.Add(new DateTime(2009, 11, 23));
dateRange.Add(new DateTime(2010, 5, 2));
dateRange.Add(new DateTime(2010, 7, 17));
dateRange.Add(new DateTime(2010, 7, 10));
dateRange.Add(new DateTime(2009, 11, 28));
dateRange.Add(new DateTime(2009, 11, 16));
dateRange.Add(new DateTime(2010, 1, 30));
dateRange.Add(new DateTime(2010, 3, 1));
dateRange.Add(new DateTime(2010, 9, 23));
dateRange.Add(new DateTime(2010, 5, 1));
dateRange.Add(new DateTime(2010, 9, 4));
ViewData["range"] = dateRange.AsQueryable();

您可以遍历它在视图中所做︰

<% var range = ViewData["range"] as IQueryable<DateTime>; %>
<% foreach (var year in range.Select(x=>x.Year)
   .Distinct()
   .OrderBy(x=>x))
{ %>

<ul>
    <li><%=year %>
    <ul>
<% foreach (var month in range.Where(x=>x.Year==year)
   .OrderBy(x=>x.Month)
   .Select(x=>x.Month)
   .Distinct()) { %>
        <li><%=(new DateTime(1900,month,1)).ToString("MMMM") %>
        <ul>
<% foreach (var day in range.Where(x => x.Year == year && x.Month == month))
{ %>
            <li>
            <%=day.ToLongDateString() %>
            </li>
<% } %>
        </ul>
        </li>
<% } %>
    </ul>
    </li>
</ul>

理想情况下你只是想要可以使用扩展方法或者一个包装类,这样你就可以做︰

foreach(var year in range.DistinctYears())

个月环绕周围的整数值的英语格式的东西就太好了。

请参阅如何出你。

官方微信
官方QQ群
31647020