使用LINQ和Lambda进行多选和连接

时间:2012-11-14 18:58:37

标签: c# linq lambda

如何使用query

执行此操作LINQ and LAMBDA

QUERY

Select san_negocio.imovel_id
      ,san_negocio.negocio_id
      ,san_imovel.credenciada_id
      ,san_proposta.proposta_id
      ,san_proposta.credenciada_id
  from san_negocio
  join san_proposta
    on san_negocio.imovel_id = san_proposta.imovel_id
  join san_imovel
    on san_negocio.imovel_id = san_imovel.imovel_id
 where san_negocio.credenciadacaptadora_id is null
   and san_negocio.credenciadavendedora_id is null
   and san_proposta.statusproposta_id = 2

我试过了:

var objetos = db.San_Negocio.Join(db.San_Proposta, a => a.Imovel_Id, b => b.Imovel_Id, (a, b) => new { San_Negocio = a, San_Proposta = b })                
    .Join(db.San_Imovel, a => a.San_Negocio.Imovel_Id, c => c.Imovel_Id, (a, c) => new { San_Negocio = a, San_Imovel = c })
    .Where(a => a.San_Negocio.San_Negocio.CredenciadaCaptadora_Id == null && a.San_Negocio.San_Negocio.CredenciadaVendedora_Id == null)
    .Select(a => new { a.San_Negocio.San_Negocio.Negocio_Id, 
            a.San_Negocio.San_Negocio.Imovel_Id, 
            a.San_Imovel.Credenciada_Id });

我怀疑是Select。如何调用我的San_Proposta表?

2 个答案:

答案 0 :(得分:6)

您将San_Proposta隐藏在名为San_Negocio的字段中,因此调用a.San_Negocio.San_Proposta会访问它,但我建议您以不嵌套字段的方式编写联接,例如:

var objetos = db.San_Negocio
    .Join(db.San_Proposta, 
          a => a.Imovel_Id,
          b => b.Imovel_Id, 
          (a, b) => new { San_Negocio = a, San_Proposta = b })                
    .Join(db.San_Imovel, 
          a => a.San_Negocio.Imovel_Id,
          c => c.Imovel_Id,
          (a, c) => new { a.San_Negocio, a.San_Proposta, San_Imovel = c })
    .Where(a => a.San_Negocio.CredenciadaCaptadora_Id == null && 
                a.San_Negocio.CredenciadaVendedora_Id == null)
    .Select(a => new
                 {
                     a.San_Negocio.Negocio_Id, 
                     a.San_Negocio.Imovel_Id,
                     a.San_Proposta.San_Proposta_Id, 
                     a.San_Imovel.Credenciada_Id
                 });

答案 1 :(得分:5)

这是一个合适的linq声明:

from neg in db.san_negocio
join prop in san_proposta
    on neg.imovel.id equals prop.imovel_id
join imo in san_imovel
    on neg.imovel_id = imo.imovel_id
where neg.credenciadacaptadora_id == null && 
    neg.credenciadavendedora_id == null &&
    prop.statusproposta_id == 2
select new {
    ImovelID = neg.imovel_id,
    NegocioID = neg.negocio_id,
    Imo_CredenciadaID = imo.credenciada_id,
    PropostaID = prop.proposta_id
    Prop_CredenciadaID = prop.credenciada_id
};

这将使用上面列出的属性创建一个IQueryable匿名对象。