2016-01-23 5 views
2

Учитывая коллекцию Книга и каждая книга имеют коллекцию Store. Используя Linq, как я могу сопоставить это с коллекцией Store, в которой есть коллекция Book?Картографические модели с Linq

Целевые классы не совпадают с классами происхождения.

Преобразовать сборник книги определяется как:

public class Book 
{ 
    int Id { get; set; } 
    string Name { get; set; } 
    Store[] Stores { get; set; } 
} 

public class Store 
{ 
    int Id { get; set; } 
    string Name { get; set; } 
} 

В коллекции магазина определяется как:

public class DestinationStore 
{ 
    int Id { get; set; } 
    string Name { get; set; } 
    Book[] Books { get; set; } 
} 

public class DestinationBook 
{ 
    int Id { get; set; } 
    string Name { get; set; } 
} 

ответ

0

Завершено группирование по Хранилище, а затем заселение магазина.Куды для каждого магазина. Думал, что, возможно, было более элегантное решение.

var stores = books.SelectMany(x => x.Stores).GroupBy(x => new 
{ 
    x.Id, 
    x.Name 
}).Select(x => new DestinationStore 
{ 
    Id = x.Key.Id, 
    Name = x.Key.Name, 
    Books = books.Where(bookFilter => bookFilter.Stores.Select(store => store.Id).Contains(x.Key.Id)) 
     .Select(book => new DestinationBook 
     { 
      Id = book.Id, 
      Name = book.Name 
     }).ToArray() 
}); 
1

Это должно сделать трюк:

public class Book 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public Store[] Stores { get; set; } 
} 

public class Store 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public static void Main() 
{ 
    List<Book> books = new List<Book>(); 
    var stores = books.SelectMany(x => x.Stores) // flatMap method, returns a collection of stores 
         .Distinct() // only keep different stores 
         .Select(x => // foreach store 
          new { // create a new object 
           Store = x, // that contains the store 
           Books = books.Where(book => book.Stores.Contains(x)).ToList() // and a list of each book that is in the store 
           }) 
         .ToList(); 
    Console.WriteLine(stores); 
} 

Вместо анонимный тип данных (new { Store = ..., Books = ...}), вы можете создать любую требуемую структуру данных, например объект вашего класса Store, который содержит массив книг)

+1

Благодарим за попытку помочь мне преодолеть этот ментальный блок. Хотя проблема с этим решением. Вам нужно будет переопределить 'Object.Equals' и' Object.GetHashCode' для того, чтобы вызов 'Distinct()' работал так, как вы ожидали. Я ответил на вопрос об этом в прошлом http://stackoverflow.com/a/9601805/525558. – Craig

+0

Я подумаю о том, как преодолеть это, я буду комментировать снова и отредактировать свой ответ, если что-то подходящее приходит мне на ум :) –

+0

Взгляните на ссылку, которую я опубликовал в комментарии. Он показывает переопределение Equals и GetHashCode. Это позволяет определить, как определяется равенство. В дополнение к этому вы также можете реализовать 'IEquatable ' для повышения производительности, как было предложено. Снова очень ценю, что вы нашли время, чтобы ответить на мой вопрос :) – Craig

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