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
});
谢谢!
您可以尝试从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();