Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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# 如何使用LINQ和实体框架6进行表连接?_C#_Sql_Asp.net_Linq_Entity Framework - Fatal编程技术网

C# 如何使用LINQ和实体框架6进行表连接?

C# 如何使用LINQ和实体框架6进行表连接?,c#,sql,asp.net,linq,entity-framework,C#,Sql,Asp.net,Linq,Entity Framework,我有三张表格:考试>目标>客观细节 下面是它们的样子: public class Exam { public Exam() { this.Objectives = new HashSet<Objective>(); } public int ExamId { get; set; } public int SubjectId { get; set; } public virtual ICollection<Objec

我有三张表格:考试>目标>客观细节

下面是它们的样子:

public class Exam
{
    public Exam()
    {
        this.Objectives = new HashSet<Objective>();
    }
    public int ExamId { get; set; }
    public int SubjectId { get; set; }
    public virtual ICollection<Objective> Objectives { get; set; }
}

public class Objective : AuditableTable
{
    public Objective()
    {
        this.ObjectiveDetails = new HashSet<ObjectiveDetail>();
    }
    public int ObjectiveId { get; set; }
    public int ExamId { get; set; }
    public int Number { get; set; }
    public virtual Exam Exam { get; set; }
    public virtual ICollection<ObjectiveDetail> ObjectiveDetails { get; set; }

}

public partial class ObjectiveDetail
{
    public int ObjectiveDetailId { get; set; }
    public int ObjectiveId { get; set; }
    public int Number { get; set; }
    public string Text { get; set; }
    public virtual Objective Objective { get; set; }
}
或者来自如下的客观细节:

 var result = await db.Exams
                      .Where(e => e.Name == name)
 var result = db.ObjectiveDetails .. ??

如何获取显示给定考试目标和目标详细信息的对象?我应该从db.examies开始还是从db.ObjectiveDetails开始?我只需要做一个连接(如果在仅关系的世界中)。但对于LINQ,我不确定从何处开始。

这将返回分组的select、key和count的枚举。最后转换为list,这样就可以检索到当时的所有数据

From e in db.Exam 
join o in objective on e.objectiveid = o.id
join od in objectivedetails on o.objectivedeailsId = od.id
select e
 var results = simulacao.Geracao
                .SelectMany(g => g.ObterCarteiras())
                .SelectMany(cg => cg.CarteiraGeneticaInvestimento)
                .SelectMany(cgi => cgi.HistoricoNaoPodeInvestir)
                .GroupBy(hnpi => hnpi.TipoNaoPodeInvestir)
                .Select(g => new { Tag = g.Key, Frequency = g.Count() })
                .ToList();
这与前面的行为相同,但有两种方法可以通过LINQ获得完全相同的信息

var geracoes = (from g in simulacao.Geracao
                        from cg in g.ObterCarteiras()
                        from cgi in cg.CarteiraGeneticaInvestimento
                        from hnpi in cgi.HistoricoNaoPodeInvestir
                        group hnpi by hnpi.TipoNaoPodeInvestir into g
                        select new
                        {
                            TipoNaoPodeInvestir = Utilities.GetEnumDescription((EnumTipoNaoPodeInvestir)g.Key),
                            Count = g.Count()
                        }).ToList();
最后,我们可以将列表转换为json结果

return Json(geracoes, JsonRequestBehavior.AllowGet);

请注意,使用“select new”(选择新建)我们创建了一种新类型的对象,只有两个属性

这是我通常在连接两个或多个表时所做的,不知道这是否是您要查找的:

var info = from p in db.Exam 
           join q in db.objective on p.objectiveid equals q.id
           join r in db.objectivedetails on q.objectivedeailsId equals r.id
           select new
                       {
                           ExamId  = p.ExamId 
                           SubjectId= p.SubjectId
                           ObjectiveId= q.ObjectiveId
                           Number = q.Number
                           ObjectiveDetailId = r.ObjectiveDetailId
                           Text = r.Text
                       } into x
           select x;

假设实体框架已正确连接实体之间的关系,则以下内容应返回单个检查,以及相关目标和详细信息:-

var query = db.Exams.Include(e => e.Objectives.Select(o => o.ObjectiveDetails));

var examEntity = query.SingleOrDefault(e => e.ExamId == targetExamId);
上面的查询将在后台使用外部连接,因此即使没有关联的目标/详细信息,也会始终返回一个检查(如果找到)。考试作为单个对象返回,如果适用,还包括子目标

或者,下面将使用内部连接返回展平结果集:-

var query = from exam in db.Exams
            from objective in exam.Objectives
            from detail in objective.ObjectiveDetails
            select new
            {
                ExamId = exam.ExamId,
                SubjectId = exam.SubjectId
                ObjectiveId = objective.ObjectiveId
                ObjectiveNumber = objective.Number
                DetailId = detail.DetailId
                DetailNumber = detail.Number
                Text = detail.Text
            };

var examDetails = query.Where(e => e.ExamId == targetExamId).ToArray();

显式使用Linq的“join”关键字没有什么错,但是如果EF知道实体是如何关联的,则通常不需要这样做。

您当前的结构似乎很好,而且如果您从db.Exam开始,那么检查是正确的方式。@KrunalPatil-但是如果我从db.Exam开始,那么我如何加入其他对象?不确定属性的正确名称,但应该是类似的,希望您能理解。两个
join
s上的条件都应该使用
equals
,而不是
=
。它应该是
在e.objectiveid等于o.id的objective中加入o,另一个连接也是如此。耶!这就是统治的林肯!