2016-11-23 2 views
9

Обратите внимание: Я видел, что в переполнении стека есть много вопросов. Но они не работают для меня, поскольку у меня немного другая ситуация. Поэтому, пожалуйста, не отмечайте его как дубликат, пока не прочитаете весь вопрос правильно и не поймете сценарий, который я хочу.Группа по нескольким столбцам В LINQ в C#

У меня есть класс, как выглядит следующим образом:

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

Я хотел бы сгруппировать их по IssuerName и DateOfIssue для следующих viewModel класс:

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

И данные будут отображаться следующим образом: (Screenshot данные будут заменены предыдущими данными таблицы после успешного группирования) enter image description here

Особое внимание:Существует ничего плохого в моем 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 
       }; 
+2

просто передайте код, который вы пробовали – geo

+0

@geo, Добавил мой код !! – TanvirArjel

ответ

10

Книги = g.ToList() // На самом деле эта линия не работает

Вероятно потому, что книги свойство типа 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 
       }); 

Я сгруппированных по: x.IssuerName, x.DateOfIssue. Я сделал это, передав анонимный тип в GroupBy() следующим образом: x => new { x.IssuerName, x.DateOfIssue }.

Сейчас они находятся в ключе, и вы можете получить доступ к IssuerName и DateOfIssue от KEY в ЗЕЬЕСТЕ, как в следующем: b.Key.IssuerName и b.Key.DateOfIssue.

+2

О!Я сделал именно то, что вы сделали, но, к сожалению, я ошибся (bn => bn.BookName) как (bn => bn.IssuerName), которого я не заметил! Большое спасибо.. – 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

Смежные вопросы