Linq's GroupBy
будет то, что вы ищете.
В качестве отправной точки, чтобы получить список продуктов с соответствующими цветами ...
var results = context.ProductColors
.Select(x => new {ProductName = x.Product.Name, ColorName = x.Color.Name})
.GroupBy(x => x.ProductName)
.ToList() // Needed for the string.Join since EF won't understand that.
.Select( group => new
{
ProductName = group.Key, // Product.Name
Colours = string.Join(", ", group.Select(x=> x.ColourName)); // Colour.Names
}).ToList();
Редактировать: чтобы избежать лишних ToList
, выберите результаты в ViewModel и отформатируйте в ViewModel цвета:
public class ProductColourSummary
{
public string ProductName { get; set; }
public List<string> Colors { get; set; } = new List<string>();
public string FlattenedColors
{
get { return string.Join(", ", Colors); }
}
}
var results = context.ProductColors
.Select(x => new {ProductName = x.Product.Name, ColorName = x.Color.Name})
.GroupBy(x => x.ProductName)
.Select( group => new ProductColorSummary
{
ProductName = group.Key, // Product.Name
Colours = group.Select(x=> x.ColourName).ToList()
}).ToList();
Затем для отображения результатов используйте result.ProductName и result.FlattensColors.