我有从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; }
}
并希望我想做的是从两个表中获取数据。使用ProductMeta加入Product的最佳方法是什么,因为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
});
谢谢!
答案 0 :(得分:0)
您可以尝试从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>
的对象..这些对象将具有属性调用Product
,该属性将具有所有Product
属性。如果关闭延迟加载,您可能需要使用Include
。那看起来像是
from pm in _dbContext.Set<ProductMeta>().Include("Product")
在linq查询后附加FirstOrDefault()
以获取单个ProductMeta
对象
select pm).FirstOrDefault();