【问题标题】:asp.net order and GroupBy lists in a dictionary in a controller mvc3 class控制器 mvc3 类中的字典中的 asp.net 顺序和 GroupBy 列表
【发布时间】:2011-07-20 09:26:59
【问题描述】:

我正在使用 linq2sql 开发一个 asp.net mvc3 应用程序。

我有一个 SiteLog 对象类型列表,其中还包含每个对象:一个名为 CLRExceptionType 的字符串和一个名为 EntryDate 的日期。此列表包含在字典中:

private Dictionary<string, List<SiteLog>> dataBaseList = new Dictionary<string, List<SiteLog>>();
DataClasses1DataContext db = new DataClasses1DataContext("string1");
DataClasses1DataContext db2 = new DataClasses1DataContext("string2");

我在函数中的同一个控制器中填充词汇:

       private void CreateDictionary()
    {   
        dataBaseList.Add("db", db.SiteLogs.ToList());
        dataBaseList.Add("db2", db2.SiteLogs.ToList());
    }

所以对于每个“数据库”,我都有一个发生异常的列表。

现在我必须在视图上显示,对于每个数据库,发生的异常按异常分组并按日期排序。

例如,输出将是:Database1:
Exception1(22 次)最后发生:22.10.1989 19:30
Exception2(2 次)最后一次发生在 20.5.1980 14.50

然后突然用名为 Exception2 的新条目更新对象,所以我必须显示:
Exception2 (3 次) 最后发生于 20.7.2011 9:00
Exception1(22 次)最后发生:22.10.1989 19:30

如何使用 groupby 或控制器中的任何其他解决方案来实现此目的? 我将字典返回到视图。

提前致谢

【问题讨论】:

    标签: c# asp.net linq linq-to-sql asp.net-mvc-3


    【解决方案1】:

    试试这个:

    var result =
      dataBaseList.GroupBy(x => x.Key)
                  .SelectMany(x =>
                                x.SelectMany(n => n.Value
                                                   .GroupBy(g => g.CLRExceptionType)
                                                   .Select(g => new
                                                                {
                                                                  DB = x.Key,
                                                                  Exception = g.Key,
                                                                  Count = g.Count(), 
                                                                  LastOccured = 
                                                                   g.Max(y =>
                                                                         y.EntryDate)
                                                                })))
                  .OrderBy(x => x.DB)
                  .ThenByDescending(x => x.LastOccured);
    

    这会按键(= 数据库)对您的字典进行分组。然后按异常类型对每个组进行分组。对于每个这样的组,都会选择一个匿名类型,其中包含您要显示的所有数据。 SelectMany 将数据从IEnumerable&lt;IEnumerable&lt;T&gt;&gt; 展平为IEnumerable&lt;T&gt;。然后按数据库排序结果,然后按最后发生的日期排序。
    结果将是一个匿名类型实例的列表,每个实例都包含您要显示的信息。

    【讨论】:

    • 我在 CLRExceptionType 上遇到错误,它似乎没有看到它:错误 1 ​​'System.Collections.Generic.KeyValuePair>'不包含“CLRExceptionType”的定义,并且没有扩展方法“CLRExceptionType”接受“System.Collections.Generic.KeyValuePair>”类型的第一个参数(您是否缺少 using 指令或程序集引用?)
    • 请再试一次。我将SelectMany 的行从x.GroupBy 更改为x.Value.GroupBy
    • .OrderBy(y => y.DB) .ThenByDescending(y => y.L​​astOccured));我必须将 x 更改为 y,否则会出错。顺便说一句,调试它,它似乎只从一个数据库中获取值,而不是从第二个数据库中获取值。或者它也为 db2 的条目写入 db ......我如何访问视图中的字段?似乎做一个 foreach 然后 item.ID item.Exception 不起作用,我有一个 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'object' does not contain a definition for 'DB'
    • @Attila:抱歉,我错过了在OrderBy 上方的行中复制右括号。固定。
    • @Atilla:如果你想从你的方法返回分组结果,你不能使用匿名类型,你需要创建一个具有这四个属性的类并使用new YourClass {而不是@ 987654329@.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    相关资源
    最近更新 更多