C# 如何使用Entity Framework生成此查询以返回相应的集合?

C# 如何使用Entity Framework生成此查询以返回相应的集合?,c#,entity-framework,linq,C#,Entity Framework,Linq,如何使用Entity Framework生成此查询,以返回问题只有一个主题的相应集合 select * from TD_ENCUESTAS as e join td_preguntas as p on e.ENC_ID = p.PRE_ENC_ID join TC_TEMAS as t on p.PRE_TEM_ID = t.TEM_ID; 鉴于模型设置正确,这将非常容易: var encuestas = context.Encuestas .Include(x => x.

如何使用Entity Framework生成此查询,以返回问题只有一个主题的相应集合

select * 
from TD_ENCUESTAS as e 
join td_preguntas as p on e.ENC_ID = p.PRE_ENC_ID 
join TC_TEMAS as t on p.PRE_TEM_ID = t.TEM_ID;

鉴于模型设置正确,这将非常容易:

var encuestas = context.Encuestas
    .Include(x => x.Preguntas.Tema)
要使其正常工作,您需要:

public class Encuesta
{
    public virtual ICollection<Pregunta> Preguntas { get; set; }
}

public class Pregunta
{
    public Tema Tema { get; set; }
}

public class Tema
{
    // not actually needed but for clarification
    public virtual ICollection<Pregunta> Preguntas { get; set; }
}
公共类Encuesta
{
公共虚拟ICollection Preguntas{get;set;}
}
公共课预科
{
公共Tema Tema{get;set;}
}
公共类Tema
{
//实际上不需要,但需要澄清
公共虚拟ICollection Preguntas{get;set;}
}

鉴于模型设置正确,这将非常容易:

var encuestas = context.Encuestas
    .Include(x => x.Preguntas.Tema)
要使其正常工作,您需要:

public class Encuesta
{
    public virtual ICollection<Pregunta> Preguntas { get; set; }
}

public class Pregunta
{
    public Tema Tema { get; set; }
}

public class Tema
{
    // not actually needed but for clarification
    public virtual ICollection<Pregunta> Preguntas { get; set; }
}
公共类Encuesta
{
公共虚拟ICollection Preguntas{get;set;}
}
公共课预科
{
公共Tema Tema{get;set;}
}
公共类Tema
{
//实际上不需要,但需要澄清
公共虚拟ICollection Preguntas{get;set;}
}

在这种情况下,当您拥有美丽的导航属性时,为什么要使用连接?@CamiloTerevinto是的,您是对的。我使用join to,以便他能够理解linqjoin(正如他在问题中所问的)。当然,你的解决方案是最好的。@CamiloTerevinto两种方法都不比另一种好,而且每种方法都是不同的结果。使用.Include可以生成与实体类相同的对象图,而使用join可以执行到展开模型或组织方式与源类不同的模型的投影。您应该熟悉这两种方法。Ziaul的方法也可以执行得更好,因为它不像.Include那样需要查询批处理(多个查询被批处理以获取相关列表),还允许您限制检索到的数据量。@AaronLS这两种方法我都很熟悉,但我通常只使用这个答案的方法来展平或投影到不同的实体,OP没有说他们想要that@CamiloTerevinto实际上,这个答案更接近op的示例SQL。您的答案将生成一个对象图和一个查询批处理。此答案将生成一个包含联接的查询,并提供与OP的查询相同的访问平面视图。在这种情况下,当您拥有漂亮的导航属性时,为什么要使用联接?@CamiloTerevinto是的,您是对的。我使用join to,以便他能够理解linqjoin(正如他在问题中所问的)。当然,你的解决方案是最好的。@CamiloTerevinto两种方法都不比另一种好,而且每种方法都是不同的结果。使用.Include可以生成与实体类相同的对象图,而使用join可以执行到展开模型或组织方式与源类不同的模型的投影。您应该熟悉这两种方法。Ziaul的方法也可以执行得更好,因为它不像.Include那样需要查询批处理(多个查询被批处理以获取相关列表),还允许您限制检索到的数据量。@AaronLS这两种方法我都很熟悉,但我通常只使用这个答案的方法来展平或投影到不同的实体,OP没有说他们想要that@CamiloTerevinto实际上,这个答案更接近op的示例SQL。您的答案将生成一个对象图和一个查询批处理。此答案将生成带有联接的单个查询,并提供与OP的查询相同的访问平面视图。错误CS1061“ICollection”不包含“tc_-temas”的定义,也不存在任何接受类型为“ICollection”的第一个参数的扩展方法“tc_-temas”(是否有任何指令使用或程序集引用?)@DanielCruzPablo我使用了泛型名称,您应该更改代码以匹配您拥有的类是的,我已经更改为泛型名称,但我标记了相同的错误。同意,这是EF使用的方式。我仅在导航属性不可用时使用联接。错误CS1061“ICollection”不包含“tc_-temas”的定义,也没有任何扩展方法“tc_-temas”接受类型为“ICollection”的第一个参数(是否有任何指令使用或程序集引用?@DanielCruzPablo我使用了泛型名称,您应该更改代码以匹配您拥有的类是的,我已经更改为泛型名称,但我标记了相同的错误。同意,这是EF打算使用的方式。我仅在导航属性不可用时使用连接。