LINQ-запросы на основе методов - PullRequest
0 голосов
/ 11 сентября 2018

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

Product

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; }

ProductImage

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) и варианты *

* варианты будутбыть список всех вариантов продукта.Один вариант может быть комбинацией всех вариантов VariantIds с одинаковыми идентификаторами 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 // ?
            }
        }
    }

Iне знаю, как мне двигаться дальше.Как извлечь вариант на основе идентификаторов GUID?

1 Ответ

0 голосов
/ 12 сентября 2018

Логика объединения 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();
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...