Entity framework 基于方法的linq查询

Entity framework 基于方法的linq查询,entity-framework,linq,lambda,Entity Framework,Linq,Lambda,我在数据库中有五个表,其实体类如下- 产品 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

我在数据库中有五个表,其实体类如下-

产品

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 
public int ProductVariantId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<ProductVariantMapping> ProductVariantMappings 
产品变量映射

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 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 
public int ProductVariantId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<ProductVariantMapping> ProductVariantMappings 
现在我必须将我的产品转换为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; }
}
公共类ProductDetailDTO
{
public int ProductId{get;set;}
公共字符串名称{get;set;}
公共字符串类别{get;set;}
公共字节[]映像{get;set;}
公共字符串说明{get;set;}
公共字符串品牌{get;set;}
公共列表变量{get;set;}
}
公共类变体
{
公共字符串名称{get;set;}
公共字符串值{get;set;}
public System.Guid Guid{get;set;}
公共十进制价格{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 // ?
            }
        }
    }
void ToDTO(列出产品)
{
ekartenties ekartenties=新ekartenties();
ProductDetailDTO ProductDetailDTO=新ProductDetailDTO();
foreach(产品中的var项目)
{
productDetailDTO.ProductId=item.ProductId;
productDetailDTO.Name=item.Name;
productDetailDTO.Category=item.ProductCategory.Name;
productDetailDTO.Description=项目描述;
productDetailDTO.Brand=项目.Brand;
productDetailDTO.Image=item.ProductImages.ElementAt(0.Image);
foreach(item.ProductVariantMappings中的var变量)
{
productDetailDTO.Variants=variant.ProductVariant/?
}
}
}

我不知道我该怎么进一步。如何基于GUID提取变量?

映射表中组合具有相同
GUID
ProductVariant
条目的逻辑似乎并不清楚,但是您可以通过
GUID
ProductVariantMappings
中的条目进行分组,然后在组中添加您喜欢的任何logc。下面是一个示例,我在一组具有相同
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();
    }
}
void ToDTO(列出产品)
{
ekartenties ekartenties=新ekartenties();
ProductDetailDTO ProductDetailDTO=新ProductDetailDTO();
foreach(产品中的var项目)
{
productDetailDTO.ProductId=item.ProductId;
productDetailDTO.Name=item.Name;
productDetailDTO.Category=item.ProductCategory.Name;
productDetailDTO.Description=项目描述;
productDetailDTO.Brand=项目.Brand;
productDetailDTO.Image=item.ProductImages.ElementAt(0.Image);
productDetailDTO.Variants=item.ProductVariantMappings
.GroupBy(pm=>pm.GUID)
.选择(g=>新变量
{
Guid=g.键,
//这里应该有一些逻辑来获得变体组合的名称
//我只是先走一步
Name=g.FirstOrDefault()?.ProductVariant?.Name,
//这里应该有一些逻辑来获取变量组合的值
//再来一次
Value=g.FirstOrDefault()?.Value,
Price=//需要库存表来计算价格
})
.ToList();
}
}

还要注意,您需要以某种方式将关系添加到inventory表中,这在本文中并没有给出。希望有帮助。

您的意思是要按GUID对ProductVariant映射进行分组吗?请添加库存表及其与ProductVariant的关系。
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();
    }
}