2015-11-03 3 views
2

В моих структур данных у меня есть следующие классы:Выбор обоих родительских и дочерних элементов при запросе дочерние свойства

public partial class Item 
{ 
    // stuff 
    public int QuoteId { get; set; } 
    public virtual ItemType ItemType { get; set; } 
} 

public partial class ItemType 
{ 
    //stuff 
    public virtual ICollection<Item> Items { get; set; } 
} 

То, что я хочу сделать, это получить список всех ItemTypes, каждый из которых имеет свои товары коллекция, заполненная согласно QuoteId.

Так, например, если есть три типа вещь, только два из которых имеют элементы с цитатой Id 50:

  • ItemType1
    • Item.QuoteId == 50
  • ItemType2
  • ItemType3
    • Item.QuoteId == 50

мне удалось получить что-то близкое с этим запросом:

r.ItemTypes.Select(x => x.Items.Where(i => i.QuoteId == CurrentQuote.QuoteId)); 

Но что это дает вам (как и следовало ожидать, так как я Select Входящий в комплект поставки) является IEnumerable<IEnumerable<Item>>. У меня есть структура, которой я занимаюсь, но у меня нет данных ItemType.

Я понимаю, что это глупый вопрос, но я расстроен своей неспособностью получить ответ.

ответ

9
r.ItemTypes.Where(x => x.Items.Any(i => i.QuoteId == CurrentQuote.QuoteId)); 

Если вам нужно, чтобы получить все ItemTypes и только определенные элементы для каждой, вы можете сделать это:

r.ItemTypes.Select(x => new 
{ 
    x, 
    FilteredItems = x.Items.Where(i => i.QuoteId == CurrentQuote.QuoteId) 
}); 

После этого необходимо назначить x.Items для FilteredItems для каждого ItemType

+0

Nope. Спасибо за попытку помочь, но я уже пробовал это. Это дает мне список предметов. Мне нужен список ItemTypes. Очевидно, я не очень хорошо себя объяснил. –

+0

@MattThrower попробуйте обновиться – Backs

+0

Спасибо - однако, мне нужно получить * все * ItemTypes, независимо от того, есть ли у них элементы или нет. Эквивалент SQL будет левым соединением. Извините, я чувствую, что очень плохо себя объяснил. –

2

You необходимо выбрать свойство Item.ItemType, если вы хотите, чтобы все ItemType s данного QuoteId. Вы также должны использовать SelectMany расправьте «вложенную» коллекцию:

IEnumerable<ItemType> types = r.ItemTypes 
    .SelectMany(x => x.Items.Where(i => i.QuoteId == CurrentQuote.QuoteId) 
          .Select(i => i.ItemType)); 

Если вы не заинтересованы в вложенной ItemType (не знает, логики), вы можете использовать Backs' approach:

IEnumerable<ItemType> types = r.ItemTypes 
    .Where(x => x.Items.Any(i => i.QuoteId == CurrentQuote.QuoteId)); 
0
var result = from itemTypes in r.ItemTypes 
      where itemTypes.QuoteId equals CurrentQuote.QuoteId 
      select new {itemType = itemTypes} 
Смежные вопросы