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

时间:2015-07-04 17:24:12

标签: c# sql asp.net-mvc entity-framework

我有从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
            });

谢谢!

1 个答案:

答案 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();