在C#LINQ中按多列分组

Tan*_*jel 11 c# linq asp.net-mvc entity-framework

我有一个类如下:

public class ActualClass
{
    public string BookName { get; set; }
    public string IssuerName { get; set; }
    public DateTime DateOfIssue { get; set; }
    public bool Status { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

它在表中有以下数据: 在此输入图像描述

我想通过IssuerNameDateOfIssue将它们分组为以下viewModel类:

public class ViewModel
{
   public string IssuerName { get; set; }
   public DateTime DateOfIssue { get; set; }
   public List<string> Books { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

数据将显示如下:( 成功分组后,屏幕截图数据将被前一个表数据替换) 在此输入图像描述

特别注意: 根据我的期望,我的ViewModel有什么问题吗?

在完成了一些stackoverflow的答案后,我尝试了很多,但没有一个对我有用.任何帮助将受到高度赞赏.

我试过的代码:

var viewmodel = from b in db.BookIssues
                group b by new
                {
                    b.IssuerName,
                    b.DateOfIssue
                }
                into g
                select new ViewModel()
                {
                    Name = g.key.IssuerName,
                    DateOfIssue = g.Key.DateOfIssue,
                    Books = g.ToList() //Actually this line of code is not working
                };
Run Code Online (Sandbox Code Playgroud)

kat*_*330 13

Books = g.ToList()//实际上这行不起作用

可能是因为Books属性是类型List<string>,而不是List<ActualClass>.

你可以试试这个查询吗,我加上b.Select(bn => bn.BookName).ToList()只提取书籍的名字:

var books = new List<ActualClass>
{
   new ActualClass { BookName = "A", DateOfIssue = new DateTime(2015, 10, 10, 10, 10, 0), IssuerName = "1" },
   new ActualClass { BookName = "B", DateOfIssue = new DateTime(2015, 10, 10, 10, 10, 0), IssuerName = "1" },
   new ActualClass { BookName = "C", DateOfIssue = new DateTime(2015, 10, 10, 10, 10, 0), IssuerName = "1" },
   new ActualClass { BookName = "D", DateOfIssue = new DateTime(2015, 10, 10, 10, 10, 0), IssuerName = "2" },
   new ActualClass { BookName = "E", DateOfIssue = new DateTime(2015, 10, 10, 12, 10, 0), IssuerName = "2" },
   new ActualClass { BookName = "F", DateOfIssue = new DateTime(2015, 10, 10, 12, 10, 0), IssuerName = "2" }
};

var result = books.GroupBy(x => new { x.IssuerName, x.DateOfIssue })
                .Select(b => new ViewModel
                {
                    Books = b.Select(bn => bn.BookName).ToList(),
                    // Accessing to DateOfIssue and IssuerName from Key.
                    DateOfIssue = b.Key.DateOfIssue,
                    IssuerName = b.Key.IssuerName
                });
Run Code Online (Sandbox Code Playgroud)

我分组: x.IssuerName, x.DateOfIssue.我通过GroupBy()以下方式传递匿名类型来做到这一点:x => new { x.IssuerName, x.DateOfIssue }.

现在它们处于密钥中,您可以从SELECT语句中的KEY 访问IssuerNameDateOfIssue,如下所示:b.Key.IssuerNameb.Key.DateOfIssue.

  • 哦!!我做了你所做的,但不幸的是我错误输入(bn => bn.BookName)为(bn => bn.IssuerName),我没注意!非常感谢.. (2认同)