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

Продукт

public int ProductId { get; set; }
public string Name { get; set; }
public int Category { get; set; }
public string Description { get; set; }
public string Brand { get; set; }
public virtual ProductCategory ProductCategory { get; set; }
public virtual ICollection<ProductImage> ProductImages { get; set; }
public virtual ICollection<ProductVariantMapping> ProductVariantMappings 

ProductCategory

public int CategoryId { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }

Изображение продукта

public int ProductImageId { get; set; }
public int ProductId { get; set; }
public byte[] Image { get; set; }
public virtual Product Product { get; set; }

ProductVariantMapping

public int MappingId { get; set; }
public int ProductId { get; set; }
public int ProductVariantId { get; set; }
public string Value { get; set; }
public System.Guid GUID { get; set; }
public virtual Product Product { get; set; }
public virtual ProductVariant ProductVariant { get; set; }

ProductVariant

public int ProductVariantId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<ProductVariantMapping> ProductVariantMappings 

Я хочу получить подробную информацию о продукте, которая должна включать ProductId, ProductName, категорию, описание, бренд, изображение (на данный момент только 1) и варианты *

* Варианты - это список всех вариантов продукта. Один вариант может быть комбинацией всех VariantId с одинаковыми GUID. (VariantName находится в таблице ProductVariant, VariantValue - в таблице ProductVariantMapping, а цена - в таблице инвентаризации).

Итак, я использовал для этой цели linq на основе методов.

EkartEntities ekartEntities = new EkartEntities();

var productDetails = ekartEntities.Products.Include(p => 

  p.ProductVariantMappings).Include(p => p.ProductImages).Include(p =>

  p.ProductCategory).Where(p => p.ProductId == 

  productDetailDTO.ProductId).ToList();

Теперь мне нужно преобразовать свой продукт в ProductDetailDTO.

ProductDetailDTO

public class ProductDetailDTO
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }
    public byte[] Image { get; set; }
    public string Description { get; set; }
    public string Brand { get; set; }
    public List<Variant> Variants { get; set; }
}

public class Variant
{
    public string Name { get; set; }
    public string Value { get; set; }
    public System.Guid Guid { get; set; }
    public decimal Price { get; set; }
}

Я начал это делать вот так -

    void ToDTO(List<Product> products)
    {
        EkartEntities ekartEntities = new EkartEntities();
        ProductDetailDTO productDetailDTO = new ProductDetailDTO();
        foreach (var item in products)
        {
            productDetailDTO.ProductId = item.ProductId;
            productDetailDTO.Name = item.Name;
            productDetailDTO.Category = item.ProductCategory.Name;
            productDetailDTO.Description = item.Description;
            productDetailDTO.Brand = item.Brand;
            productDetailDTO.Image = item.ProductImages.ElementAt(0).Image;
            foreach (var variant in item.ProductVariantMappings)
            {
                productDetailDTO.Variants = variant.ProductVariant // ?
            }
        }
    }

Я не знаю, как мне продолжить. Как я могу извлечь вариант на основе GUID?

1
Suyash Gupta 11 Сен 2018 в 12:36

1 ответ

Лучший ответ

Логика объединения записей ProductVariant с одним и тем же GUID в таблице сопоставления не кажется ясной из вопроса, однако вы можете сгруппировать записи в ProductVariantMappings по GUID, а затем добавить любой журнал, который вам нравится в группе. Вот пример, в котором я беру имя и значение в группе вариантов с тем же GUID:

void ToDTO(List<Product> products)
{
    EkartEntities ekartEntities = new EkartEntities();
    ProductDetailDTO productDetailDTO = new ProductDetailDTO();
    foreach (var item in products)
    {
        productDetailDTO.ProductId = item.ProductId;
        productDetailDTO.Name = item.Name;
        productDetailDTO.Category = item.ProductCategory.Name;
        productDetailDTO.Description = item.Description;
        productDetailDTO.Brand = item.Brand;
        productDetailDTO.Image = item.ProductImages.ElementAt(0).Image;

        productDetailDTO.Variants = item.ProductVariantMappings
            .GroupBy(pm => pm.GUID)
            .Select(g => new Variant
            {
                Guid = g.Key,

                // Here should be some logic for getting a name of the combination of Variants
                // I just take first
                Name = g.FirstOrDefault()?.ProductVariant?.Name,

                // Here should be some logic for getting a value of the combination of Variants
                // Take first again
                Value = g.FirstOrDefault()?.Value,

                Price = // need inventory table to compute price
            })
            .ToList();
    }
}

Также обратите внимание, что вам нужно как-то добавить связь с таблицей инвентаря, о которой не идет речь. Надеюсь, поможет.

1
KozhevnikovDmitry 12 Сен 2018 в 02:26