2016-11-23 77 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