Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple Select and Join with LINQ and Lambda

Tags:

c#

lambda

linq

How can I do this query using 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

I've tried:

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 });

My doubt is in my Select. How can I call my San_Proposta table ?

like image 914
Lucas_Santos Avatar asked Nov 14 '12 18:11

Lucas_Santos


2 Answers

You are hiding San_Proposta within a field called San_Negocio, so calling a.San_Negocio.San_Proposta will access it, but I recommend writing your joins in a way that fields aren't nested, like this:

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
                 });
like image 57
Risky Martin Avatar answered Sep 20 '22 08:09

Risky Martin


Here is a proper linq statement:

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
};

This will create an IQueryable of anonymous objects with the listed properties above.

like image 41
Joel Etherton Avatar answered Sep 19 '22 08:09

Joel Etherton