2013-10-01 3 views
0

Мне не удалось найти запрос linq для следующего сценария.Linq SelectMany Usage

public class Product 
{ 
    public virtual string ProductName { get; set; } 
    public virtual IList<SubProduct> SubProducts { get; set; } 
} 

public class SubProduct 
{ 
    public string SubProductName { get; set; } 

    public int SubProductTypeId { get; set; } 
} 

public class SubProductType 
{ 
    public int SubProductTypeId{ get; set; } 
    public string Description { get; set; } 
} 

var productList = List<Product>(); 

var subProductTypeLlist = List<SubProductType>(); 

У меня есть список продуктов, и у каждого продукта есть список SubProducts. Я хочу, чтобы запрос представлял {ProductName, Description}. Пожалуйста, предложите, как написать запрос linq.

ответ

1

Что-то вроде этого следует сделать трюк:

var result = productList 
    .SelectMany(p => p.SubProducts 
     .Select(sp => new { SubProduct = sp, ProductName = p.ProductName })) 
    .Select(sp => 
     new { Description = subProductTypeList 
      .Single(spt => spt.SubProduct.SubProductTypeId == sp.SubProductTypeId).Description, 
      ProductName = sp.ProductName }) 

В SelectMany мы сначала сделать запись на внутренний IEnumerable (IList реализует IEnumerable), чтобы преобразовать каждый объект подпроизведение анонимного класса держит объект подпроизведение и ProductName. Затем SelectMany преобразует это в плоский список. Затем мы используем Select в этом списке, чтобы снова создать новый анонимный класс, где на этот раз мы захватим описание из subProductTypeList. Результатом является IEnumerable анонимного класса с элементами Description и ProductName.

+0

Большое спасибо за ваш быстрый ответ и помощь. Я изменил запрос результатов в соответствии с моей потребностью и теперь работал. var products = new List(); var subProductTypeList = new List(); var typeListMap = subProductTypeList.ToDictionary (x => x.SubProductTypeId, x => x.Description); var results = productList.SelectMany (p => p.SubProducts, (t, i) => new {ProductName = t.ProductName, Description = typeListMap [i.SubProductTypeId]}). ToList(); – user1837788

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