Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF:使用多对一关系获取数据_C#_Sql_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# EF:使用多对一关系获取数据

C# EF:使用多对一关系获取数据,c#,sql,asp.net-mvc,entity-framework,C#,Sql,Asp.net Mvc,Entity Framework,我已从数据库生成实体模型: 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; s

我已从数据库生成实体模型:

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; }
}
我想做的是从两个表中获取数据。因为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
            });
var结果=
来自_dbContext.Set()中的p
其中(p.DomainID==DomainID
&&p.IsDeleted==false
&&p.ProductMeta.Select(pm=>pm.LanguageID==LanguageID&&pm.IsDeleted==false)
选择(新建)
{
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
    );
在linq查询之后追加
FirstOrDefault()
,以仅获取单个
ProductMeta
对象

select pm).FirstOrDefault();

我最近发现了。看到这些重复的谓词,看起来真的可以帮助你。这只是一个例子。我在select中有很多字段,都来自
Product
ProductMeta
,所以我必须从
Product
中进行选择。不,你只需要选择
ProductMeta
并包含
Product
>。我会更新答案。如果您试图从select中构建某种匿名类型,那么您只需使用
Field1=pm.product.Field1
etcAre获取产品属性。您确定这是个好主意吗?我有6个表之间的join查询,我想用EF编写,因此我应该在每个表之间使用
Include
或者,我需要用EF生成模型,它有表之间的连接?如果想将6个表中的数据平齐,您可以考虑使用视图,然后将视图导入到模型中。
from pm in _dbContext.Set<ProductMeta>().Include("Product")
select pm).FirstOrDefault();