实体框架4.1代码首先如何写左连接

时间:2011-12-14 22:23:46

标签: entity-framework

对于实体:

[Table("CAD_ESCOLAS")]
  public class Escola
  {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ESCOLA_ID { get; set; }

    [StringLength(120), Required]
    [MinLength(8)]
    public string ESCOLA_NOME { get; set; }

    [NotMapped]
    public String ENDESC_ENDERECO { get; set; }
   }


[Table("CAD_ENDERECO_ESCOLA")]
  public class EnderecoEscola
  {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ENDESC_ID { get; set; }

    [Required]
    public int ESCOLA_ID { get; set; }

    [Association("Escolas", "ESCOLA_ID", "ESCOLA_ID")]
    [ForeignKey("ESCOLA_ID")]
    public virtual Escola Escola { get; set; }


    [StringLength(100), Required]
    [MinLength(10)]
    public string ENDESC_ENDERECO { get; set; }

}

从sql查询:

select esc.* , ende.ENDESC_ENDERECO
 from CAD_ESCOLAS as esc left join CAD_ENDERECO_ESCOLA  as ende
    on esc.ESCOLA_ID = ende.ESCOLA_ID 
 where esc.ESCOLA_NOME like '%Escola%' 

返回:

ESCOLA_ID    ESCOLA_NOME     ENDESC_ENDERECO
1            Escola 1        Rua 1 
2            Escola 2        Rua 2
3            Escola 3        null
4            Escola 4        null

如何将sql查询转换为linq到相应的实体上面?

会是这样的,但是如何设置左连接?

 public IQueryable<Escola> GetEscola()
{
   using (SecurityCtx ctx = new SecurityCtx())
   {
     ctx.Configuration.LazyLoadingEnabled = true;
     var query = ctx.Escola.Include("EnderecoEscola").Where( p => p.ESCOLA_NOME.Contains("Escola")  . . . . . .
  Select( esco => new Escola 
       {
          ESCOLA_ID = esco.ESCOLA_ID,
          ESCOLA_NOME = esco.ESCOLA_NOME,
          ENDESC_ENDERECO = esco.ENDESC_ENDERECO,

       )).AsQueryable();

       return query;

   }

}

请非常欢迎任何建议。

1 个答案:

答案 0 :(得分:0)

虽然我不明白为什么你没有在EnderecoEscola类中定义Escola导航属性(反之亦然),但这里是查询:

from es in Escolas
    join en in enderecoEscolas
    on es.ESCOLA_ID equals en.ESCOLA_ID into JoinedEsEn
    from en in JoinedEsEn.DefaultIfEmpty()
    select new Escola()
    {
        ESCOLA_NOME = es.ESCOLA_NOME,
        ESCOLA_ID = es.ESCOLA_ID,
        ENDESC_ENDERECO = en != null ? en.ENDESC_ENDERECO : null
    };

哪个会转换为lambda,如下所示:

Escolas.GroupJoin(enderecoEscolas, es => es.ESCOLA_ID, en => en.ESCOLA_ID,
(es, JoinedEsEn) => new {es, JoinedEsEn}).SelectMany(g => g.JoinedEsEn.DefaultIfEmpty(), (g, en) => new Escola()
        {
            ESCOLA_NOME =
                g.es.ESCOLA_NOME,
            ESCOLA_ID =
                g.es.ESCOLA_ID,
            ENDESC_ENDERECO =
                en != null? en.ENDESC_ENDERECO: null
        });