【问题标题】:EF Core - Select Parent Value If NullEF Core - 如果为 Null,则选择父值
【发布时间】:2021-01-04 10:41:02
【问题描述】:

我正在尝试减少我的 Json 响应/数据库查询的大小,因此我只选择我的代码中所需的列。

我有以下表格(所有表格中有更多列,但为我的帖子简化了):

产品
产品 ID (PK)
名称
制造商
内部Sku
外部Sku

产品变化
ProductVariationId (PK)
内部Sku
外部Sku
伊恩
产品 ID (FK)

产品图片
ProductImageId (PK)
IsDefault(位)
图片网址
产品 ID (FK)
ProductVariationId (FK / Null)

我为 Product 和 ProductVariation 创建了简单的模型(ProductSimpleProductVariationSimple)。

我的代码只会为每个选择第一张图片。使用我当前的代码,我几乎可以实现我想要的,但是产品图片有问题。

Product 可以有图片,ProductVariation 也可以有图片。但是,如果 ProductVariation 没有任何图像,我想选择父产品的图像(如果有)。这可能吗?

这是我当前的代码:

var products = await _context.Product
            .Include(e => e.ProductImages.Where(p => p.IsDefault == true && p.ProductVariationId == null))
            .Include(m => m.Manufacturer)
            .Include(v => v.ProductVariations).ThenInclude(x => x.ProductImages.Where(p => p.IsDefault == true && p.ProductVariationId == x.ProductVariationId))

            .Select(p => new Product()
            {
                ProductId = p.ProductId,
                Name = p.Name,
                Manufacturer = p.Manufacturer,
                ManufacturerSku = p.ManufacturerSku,
                InternalSku = p.InternalSku,
                Ean = p.Ean,
                ProductImages = p.ProductImages,
                ProductVariations = p.ProductVariations.Select(x => new ProductVariation { 
                    ProductVariationId = x.ProductVariationId,
                    Name = x.Name,
                    InternalSku = x.InternalSku,
                    ManufacturerSku = x.ManufacturerSku,
                    Ean = x.Ean,
                    ProductImages = x.ProductImages,
                    ProductId = x.ProductId
                }).ToList()
            }
            )
            .ToListAsync();
            
            var productSimple = products.Select(
                e => new ProductSimple
                {
                    ProductId = e.ProductId,
                    Name = e.Name,
                    ManufacturerName = e.Manufacturer?.Name,
                    ManufacturerSku = e.ManufacturerSku,
                    InternalSku = e.InternalSku,
                    Ean = e.Ean,
                    ImageUrl = e.ProductImages.FirstOrDefault()?.ImageUrl,
                    ProductVariationSimples = e.ProductVariations.Select(
                        v => new ProductVariationSimple
                        {
                            ProductVariationId = v.ProductVariationId,
                            Name = v.Name,
                            InternalSku = v.InternalSku,
                            ManufacturerSku = v.ManufacturerSku,
                            Ean = v.Ean,
                            ProductId = v.ProductId,
                            ImageUrl = v.ProductImages.FirstOrDefault()?.ImageUrl  //This is where my problem is. I want to select first image of the variation or first image of parent if not available
                        })
                }
                ).AsQueryable();

            return productSimple;```

Many thanks in advance.

【问题讨论】:

    标签: c# sql-server entity-framework entity-framework-core


    【解决方案1】:

    尝试如下。

    ImageUrl = v.ProductImages.Any() ? v.ProductImages.First().ImageUrl : e.ProductImages.FirstOrDefault()?.ImageUrl
    

    【讨论】:

      【解决方案2】:

      你试过了吗?

                          v => new ProductVariationSimple
                          {
                              ProductVariationId = v.ProductVariationId,
                              Name = v.Name,
                              InternalSku = v.InternalSku,
                              ManufacturerSku = v.ManufacturerSku,
                              Ean = v.Ean,
                              ProductId = v.ProductId,
                              ImageUrl = v.ProductImages.FirstOrDefault()?.ImageUrl?? e.ProductImages.FirstOrDefault()
                          })
      

      让我知道它是否有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-20
        • 2013-06-01
        • 2019-02-20
        • 2014-11-20
        • 1970-01-01
        • 2022-12-05
        • 2016-05-18
        • 1970-01-01
        相关资源
        最近更新 更多