2015-06-25 2 views
0

У меня есть групповая модель, которая имеет отношения «многие ко многим» с двумя другими моделями. Вот упрощенный код первой, чтобы объяснить:EF6 Запрос через множественные отношения «многие ко многим»

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

    public virtual ICollection<StockGroup> StockGroups { get; set; } 
} 

public class StockItem 
    public int ID {get; set;} 
    public string Name {get; set;} 

    public virtual ICollection<StockGroup> StockGroups { get; set; } 
} 

public class StockGroup 
    public int ID {get; set;} 
    public string Name {get; set;} 

    public virtual ICollection<Store> Stores { get; set; } 
    public virtual ICollection<StockItem> StockItems { get; set; } 
} 

Использование Fluent API, который я создал многие-ко-многим между магазин и StockGroup, а также StockItem и StockGroup. Это, в свою очередь, создает две таблицы соединений.

Проблема, с которой я сталкиваюсь, я не могу создать запрос, который охватывает от Store to StockItem или наоборот, без использования циклов foreach.

Например: если у вас есть один элемент StockItem, я бы хотел знать все магазины, связанные с ним, через таблицу StockGroup. Я пробовал что-то вроде этого, но возвращаемое - это коллекция коллекции.

var stock = db.StockItems.Find(4); 
var stores = stock.StockGroups.Select(g => g.Stores); 

Как я могу переписать это, чтобы объединить StockGroups, чтобы предоставить мне коллекцию магазинов?

Спасибо!

ответ

0

Вы можете использовать SelectMany() для выравнивания иерархии:

var stores = stock.SelectMany(s => s.StockGroups).SelectMany(g => g.Stores).ToList(); 

http://blogs.interknowlogy.com/2008/10/10/use-linqs-selectmany-method-to-flatten-collections/

+0

SelectMany именно то, что я искал. Большое спасибо! Я действительно сделал то, что хотел: 'var stores = stock.StockGroups.SelectMany (g => g.Stores) .ToList();' – Karlman68

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