EF:获取具有多对一关系的数据

本文关键字:关系 数据 多对一 获取 EF | 更新日期: 2023-09-27 18:00:59

我有从DB:生成的实体模型

public partial class Product
{
    public Product()
    {
        this.ProductMeta = new HashSet<ProductMeta>();
    }
    public int ProductID { get; set; }
    public int DomainId{ get; set; }
    public bool IsDeleted { get; set; }
    public virtual ICollection<ProductMeta> ProductMeta { get; set; }
}

public partial class ProductMeta
{
    public int ProductID { get; set; }
    public int LanguageID { get; set; }
    public string ProductName { get; set; }
    public bool IsDeleted { get; set; }
    public virtual Product Product { get; set; }
}

我想做的就是从两个表中获取数据。将Product与ProductMeta结合的最佳方式是什么,因为ProductMeta有很多变体,这取决于languageId。我在哪里和选择是有效的?当我研究生成的SQL时,有许多嵌套的SELECT FROM。这很正常吗?

var result = 
            from p in _dbContext.Set<Product >()
            where (p.DomainID == domainId
                && p.IsDeleted == false
                && p.ProductMeta.Select(pm => pm.LanguageID == languageId && pm.IsDeleted == false).FirstOrDefault()
            select(new 
            {
                ProductID = p.ProductID,
                ProductName = p.ProductMeta.FirstOrDefault().ProductName
            });

谢谢!

EF:获取具有多对一关系的数据

您可以尝试从ProductMeta 中进行选择

var result = 
    (from pm in _dbContext.Set<ProductMeta>()
    where pm.LanguageID == languageId 
            && pm.IsDeleted == false
            && pm.Product.DomainID == domainId
            && pm.Product.IsDeleted == false
    select pm
    );

这将为您提供一个类型为List<ProductMeta>的对象。。这些对象将具有一个名为CCD_ 3的属性,该属性将具有所有CCD_。如果延迟加载关闭,您可能需要使用Include。这看起来像

from pm in _dbContext.Set<ProductMeta>().Include("Product")

在linq查询后附加FirstOrDefault(),只得到一个ProductMeta对象

select pm).FirstOrDefault();