2016-11-23 24 views
9

Lütfen dikkat: Yığın taşmasında bunun gibi birçok soru olduğunu gördüm. Ama benim için biraz farklı bir durum olduğu için çalışmıyorlar. Bu yüzden lütfen soruyu tam olarak okuyana ve istediğim senaryoyu anlayana kadar çoğaltmayın. aşağıdaki gibi benzeriGrup LINQ içinde Çoklu Sütun C#

Ben bir sınıf vardır:

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

Bu tablodaki verilerin aşağıdaki sahiptir: Aşağıdaki için IssuerName ve DateOfIssue tarafından isterim enter image description here

grup onları etmek viewModel sınıfı:

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

Ve verileri aşağıdaki gibi görüntülenecektir:benim ViewModel yanlış bir şey benim beklenti göre var mı: enter image description here

özel ilgi (Ekran verileri başarılı gruplama sonra önceki tablo verileri ile değiştirilecektir)?

Bazı stackoverflow cevapları izledikten sonra çok çalıştı ama hiçbiri benim için çalışma yaptı. Herhangi bir yardım çok takdir edilecektir.

denedim kodu: grup sonucundan kitap listesini seçmek gerekirse

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

Sadece denediğiniz kodu paylaşın – geo

+0

@geo, Eklenen kodum !! – TanvirArjel

cevap

10

Kitaplar = g.ToList() // ait Aslında bu hat çalışmıyor

Muhtemelen çünkü Kitaplar mülkiyet List<string> değil List<ActualClass> türüdür.

ben kitapların sadece isimlerini ayıklamak için b.Select(bn => bn.BookName).ToList() eklendi, bu sorguyu deneyin Can: 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 
       }); 

Ben göre gruplandırılmış. Ben GroupBy() içinde anonim tür geçirerek aşağıdaki şekilde: x => new { x.IssuerName, x.DateOfIssue }.

Şimdi anahtarında vardır ve aşağıdaki gibi SEÇ açıklamada KEY den IssuerName ve DateOfIssue erişebilir: b.Key.IssuerName ve b.Key.DateOfIssue.

+2

Oh !!Ne yaptığını tam olarak yaptım ama ne yazık ki ben (bn => bn.IssuerName) noitce değil olarak yanlış yazılmış (bn => bn.BookName)! Çok teşekkürler.. – TanvirArjel

2

, sen Books = v.Select(c=>c.BookName).ToList() gerek de sizin halinde gruplandırmak gerekebilir konu tarih sürede zaman var olduğuna dikkat EntityFunctions.TruncateTime işlevini kullanarak sadece tarih bölümü tarafından. Yalnızca tarihi depolarsanız, bu işlevi görmezden gelebilirsiniz.

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

Teşekkürler Çalışır! – TanvirArjel