2016-11-23 31 views
9

请注意: 我已经看到在堆栈溢出中有很多像这样的问题。但他们不适合我,因为我的情况稍有不同。因此,请不要将其标记为重复,直到正确阅读整个问题并理解我想要的场景。C#中的多列LINQ中的多个列组

我有一类像如下:

public class ActualClass 
    { 
     public string BookName { get; set; } 
     public string IssuerName { get; set; } 
     public DateTime DateOfIssue { get; set; } 
     public bool Status { get; set; } 
    } 

它具有以下表中的数据:以下 enter image description here

我想将它们按发行者名称DateOfIssue viewModel等级:

public class ViewModel 
    { 
     public string IssuerName { get; set; } 
     public DateTime DateOfIssue { get; set; } 
     public List<string> Books { get; set; } 
    } 

和数据将显示如下:有没有按照我的期望什么错在我的视图模型: enter image description here

特别注意(截图数据将通过上表的数据成功的分组后更换)?

以下一些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 
       }; 
+2

只是分享你试过的代码 – geo

+0

@geo,加了我的代码!! – TanvirArjel

回答

10

书籍= g.ToList()//其实这条线的工作不

大概是因为书籍属性的List<string>,不List<ActualClass>型。

能否请您尝试此查询,我添加b.Select(bn => bn.BookName).ToList()提取的书籍只有名称:x.IssuerName, x.DateOfIssue

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 
       }); 

我的分组。我通过以下方式在GroupBy()中通过匿名输入:x => new { x.IssuerName, x.DateOfIssue }

现在,他们都在关键的,你可以从KEY在以下访问发行者名称DateOfIssue在SELECT语句,如:b.Key.IssuerNameb.Key.DateOfIssue

+2

哦!我做了正是你所做的,但不幸的是,我打错了(bn => bn.BookName)作为(bn => bn.IssuerName),我没有noitce!非常感谢.. – TanvirArjel

2

如果您需要选择从组结果的书籍列表中,你需要Books = v.Select(c=>c.BookName).ToList()也注意到,在你的情况下,在发行日期时间时,你可能需要组仅由日期部分使用EntityFunctions.TruncateTime函数。如果你只存储日期,那么你可以忽略这个功能。

var viewmodel = db.BookIssues.GroupBy(x=>new {IssuerName =x.IssuerName, DateOfIssue=EntityFunctions.TruncateTime(x.DateOfIssue) }) 
.Select(v=>new ViewModel(){IssuerName =v.Key.IssuerName, DateOfIssue = v.Key.DateOfIssue, Books = v.Select(c=>c.BookName).ToList() }) 
.ToList(); 
+0

谢谢它的作品! – TanvirArjel