How to filter an IEnumerable type list through another IEnumerable?

4

How to filter a list type IEnumerable<> by passing a parameter of type IEnumerable<> preferably via expression lambda or linq ?

Based on the filter below, I expect this result:

{MundoId = 0, ContinenteId = "AMERICA DO SUL",   PaisId = "PERU",     UFId = "LIMA" },
{MundoId = 0, ContinenteId = "AMERICA DO SUL",   PaisId = "COLOMBIA", UFId = "BOGOTÁ" },
{MundoId = 0, ContinenteId = "AMERICA DO NORTE", PaisId = "EUA",      UFId = "NOVA IORQUE" }

Action:

 public ActionResult Index() {
     var mundo = new List < Mundo > {
      new Mundo {
       MundoId = 0, ContinenteId = 1, PaisId = 2, UFId = 4
      },
      new Mundo {
       MundoId = 0, ContinenteId = 1, PaisId = 3, UFId = 7
      },
      new Mundo {
       MundoId = 0, ContinenteId = 2, PaisId = 4, UFId = 10
      }
     };
     var _mundo = mundo.ToList();

     IEnumerable < Mundo > _mundoFiltrado = FiltrarMundo(_mundo);

     return View(_mundoFiltrado);
    }

Method Filter:

public IEnumerable < Mundo > FiltrarMundo(IEnumerable < Mundo > pMundo) {#
 region::lista Mundo::
  var mundo = new List < Mundo > {
   new Mundo {
    MundoId = 1, ContinenteId = 1, PaisId = 1, UFId = 1
   },
   new Mundo {
    MundoId = 2, ContinenteId = 1, PaisId = 1, UFId = 2
   },
   new Mundo {
    MundoId = 3, ContinenteId = 1, PaisId = 1, UFId = 3
   },
   new Mundo {
    MundoId = 4, ContinenteId = 1, PaisId = 2, UFId = 4
   },
   new Mundo {
    MundoId = 5, ContinenteId = 1, PaisId = 2, UFId = 5
   },
   new Mundo {
    MundoId = 6, ContinenteId = 1, PaisId = 2, UFId = 6
   },
   new Mundo {
    MundoId = 7, ContinenteId = 1, PaisId = 3, UFId = 7
   },
   new Mundo {
    MundoId = 8, ContinenteId = 1, PaisId = 3, UFId = 8
   },
   new Mundo {
    MundoId = 9, ContinenteId = 1, PaisId = 3, UFId = 9
   },
   new Mundo {
    MundoId = 10, ContinenteId = 2, PaisId = 4, UFId = 10
   },
   new Mundo {
    MundoId = 11, ContinenteId = 2, PaisId = 4, UFId = 11
   },
   new Mundo {
    MundoId = 12, ContinenteId = 2, PaisId = 4, UFId = 12
   },
   new Mundo {
    MundoId = 13, ContinenteId = 2, PaisId = 5, UFId = 13
   },
   new Mundo {
    MundoId = 14, ContinenteId = 2, PaisId = 5, UFId = 14
   },
   new Mundo {
    MundoId = 15, ContinenteId = 2, PaisId = 5, UFId = 15
   },
   new Mundo {
    MundoId = 16, ContinenteId = 2, PaisId = 6, UFId = 16
   },
   new Mundo {
    MundoId = 17, ContinenteId = 2, PaisId = 6, UFId = 17
   },
   new Mundo {
    MundoId = 18, ContinenteId = 2, PaisId = 6, UFId = 18
   },
   new Mundo {
    MundoId = 19, ContinenteId = 3, PaisId = 7, UFId = 19
   },
   new Mundo {
    MundoId = 20, ContinenteId = 3, PaisId = 7, UFId = 20
   },
   new Mundo {
    MundoId = 21, ContinenteId = 3, PaisId = 7, UFId = 21
   },
   new Mundo {
    MundoId = 22, ContinenteId = 3, PaisId = 8, UFId = 22
   },
   new Mundo {
    MundoId = 23, ContinenteId = 3, PaisId = 8, UFId = 23
   },
   new Mundo {
    MundoId = 24, ContinenteId = 3, PaisId = 8, UFId = 24
   },
   new Mundo {
    MundoId = 25, ContinenteId = 3, PaisId = 9, UFId = 25
   },
   new Mundo {
    MundoId = 26, ContinenteId = 3, PaisId = 9, UFId = 26
   },
   new Mundo {
    MundoId = 27, ContinenteId = 3, PaisId = 9, UFId = 27
   },
   new Mundo {
    MundoId = 28, ContinenteId = 4, PaisId = 10, UFId = 28
   },
   new Mundo {
    MundoId = 29, ContinenteId = 4, PaisId = 10, UFId = 29
   },
   new Mundo {
    MundoId = 30, ContinenteId = 4, PaisId = 10, UFId = 30
   },
   new Mundo {
    MundoId = 31, ContinenteId = 4, PaisId = 11, UFId = 31
   },
   new Mundo {
    MundoId = 32, ContinenteId = 4, PaisId = 11, UFId = 32
   },
   new Mundo {
    MundoId = 33, ContinenteId = 4, PaisId = 11, UFId = 33
   },
   new Mundo {
    MundoId = 34, ContinenteId = 4, PaisId = 12, UFId = 34
   },
   new Mundo {
    MundoId = 35, ContinenteId = 4, PaisId = 12, UFId = 35
   },
   new Mundo {
    MundoId = 36, ContinenteId = 4, PaisId = 12, UFId = 36
   }
  };#
 endregion

 # region::Lista Continente
 var continente = new List < Continente > {
  new Continente {
   ContinenteId = 1, Nome = "AMERICA DO SUL"
  },
  new Continente {
   ContinenteId = 2, Nome = "AMERICA DO NORTE"
  },
  new Continente {
   ContinenteId = 3, Nome = "EUROPA"
  }
 };#
 endregion

 # region::Lista Pais::
  var pais = new List < Pais > {
   new Pais {
    PaisId = 1, ContinenteId = 1, Nome = "BRASIL"
   },
   new Pais {
    PaisId = 2, ContinenteId = 1, Nome = "PERU"
   },
   new Pais {
    PaisId = 3, ContinenteId = 1, Nome = "COLOMBIA"
   },
   new Pais {
    PaisId = 4, ContinenteId = 2, Nome = "EUA"
   },
   new Pais {
    PaisId = 5, ContinenteId = 2, Nome = "CANADA"
   },
   new Pais {
    PaisId = 6, ContinenteId = 2, Nome = "MÉXICO"
   },
   new Pais {
    PaisId = 7, ContinenteId = 3, Nome = "FRANÇA"
   },
   new Pais {
    PaisId = 8, ContinenteId = 3, Nome = "INGLATERRA"
   },
   new Pais {
    PaisId = 9, ContinenteId = 3, Nome = "ITÁLIA"
   }
  };#
 endregion

 # region::Lista UF::
  var uf = new List < UF > {
   new UF {
    UFId = 1, PaisId = 1, Nome = "UF 1"
   },
   new UF {
    UFId = 2, PaisId = 1, Nome = "UF 2"
   },
   new UF {
    UFId = 3, PaisId = 1, Nome = "UF 3"
   },
   new UF {
    UFId = 4, PaisId = 2, Nome = "UF 4"
   },
   new UF {
    UFId = 5, PaisId = 2, Nome = "UF 5"
   },
   new UF {
    UFId = 6, PaisId = 2, Nome = "UF 6"
   },
   new UF {
    UFId = 7, PaisId = 3, Nome = "UF 7"
   },
   new UF {
    UFId = 8, PaisId = 3, Nome = "UF 8"
   },
   new UF {
    UFId = 9, PaisId = 3, Nome = "UF 9"
   },
   new UF {
    UFId = 10, PaisId = 4, Nome = "UF10"
   },
   new UF {
    UFId = 11, PaisId = 4, Nome = "UF11"
   },
   new UF {
    UFId = 12, PaisId = 4, Nome = "UF12"
   },
   new UF {
    UFId = 13, PaisId = 5, Nome = "UF13"
   },
   new UF {
    UFId = 14, PaisId = 5, Nome = "UF14"
   },
   new UF {
    UFId = 15, PaisId = 5, Nome = "UF15"
   },
   new UF {
    UFId = 16, PaisId = 6, Nome = "UF16"
   },
   new UF {
    UFId = 17, PaisId = 6, Nome = "UF17"
   },
   new UF {
    UFId = 18, PaisId = 6, Nome = "UF18"
   },
   new UF {
    UFId = 19, PaisId = 7, Nome = "UF19"
   },
   new UF {
    UFId = 20, PaisId = 7, Nome = "UF20"
   },
   new UF {
    UFId = 21, PaisId = 7, Nome = "UF21"
   },
   new UF {
    UFId = 22, PaisId = 8, Nome = "UF22"
   },
   new UF {
    UFId = 23, PaisId = 8, Nome = "UF23"
   },
   new UF {
    UFId = 24, PaisId = 8, Nome = "UF24"
   },
   new UF {
    UFId = 25, PaisId = 9, Nome = "UF25"
   },
   new UF {
    UFId = 26, PaisId = 9, Nome = "UF26"
   },
   new UF {
    UFId = 27, PaisId = 9, Nome = "UF27"
   }
  };#
 endregion

 var _continente = continente.ToList();
 var _pais = pais.ToList();
 var _uf = uf.ToList();

 //Preciso fazer o filtro aqui:
 var _mundo = mundo.ToList();

 return _mundo;
}

Entities

    public class Mundo {
 public int MundoId {
  get;
  set;
 }
 public int ContinenteId {
  get;
  set;
 }
 public int PaisId {
  get;
  set;
 }
 public int UFId {
  get;
  set;
 }
}

public class Continente {
 public int ContinenteId {
  get;
  set;
 }
 public int PaisId {
  get;
  set;
 }
 public string Nome {
  get;
  set;
 }

}

public class Pais {
 public int PaisId {
  get;
  set;
 }
 public int ContinenteId {
  get;
  set;
 }
 public string Nome {
  get;
  set;
 }
 public ICollection < Continente > Continente {
  get;
  set;
 }

}

public class UF {
 public int UFId {
  get;
  set;
 }
 public int PaisId {
  get;
  set;
 }
 public string Nome {
  get;
  set;
 }
 public ICollection < Pais > Pais {
  get;
  set;
 }

}
    
asked by anonymous 01.06.2017 / 13:28

3 answers

3

You can use something like this to get a more complete object:

var query = from r in pMundo
        join l in mundo on new { r.MundoId, r.ContinenteId, r.PaisId, r.UFId }
                equals new { l.MundoId, l.ContinenteId, l.PaisId, l.UFId } into mundos
        from m in mundos
        join c in continente on m.ContinenteId equals c.ContinenteId
        join p in pais on m.PaisId equals p.PaisId
        join u in uf on m.UFId equals u.UFId        
        select new
        {
            m.ContinenteId,
            NomeContinente = c.Nome,
            m.PaisId,
            NomePais = p.Nome,
            m.UFId,
            NomeUF = u.Nome
        };

or simply do so:

var query = from r in pMundo
        join l in mundo on new { r.MundoId, r.ContinenteId, r.PaisId, r.UFId }
                equals new { l.MundoId, l.ContinenteId, l.PaisId, l.UFId } into mundos
        from m in mundos
        join c in continente on m.ContinenteId equals c.ContinenteId
        join p in pais on m.PaisId equals p.PaisId
        join u in uf on m.UFId equals u.UFId
        select r;
    
01.06.2017 / 14:03
3

I understand that based on a IEnumerable you want to filter on another. With the Any method you will get what you want, add method Filtramundo :

 IEnumerable<Mundo> filtered = mundo
                   .Where(x => pMundo.Any(y => y.MundoId == x.MundoId)).ToList<Mundo>();
    
01.06.2017 / 14:00
2

You can write your filtering method with two parameters, one with the source list to be filtered and the other with the filters. Example:

 static IEnumerable<Mundo> FiltrarMundo(IEnumerable<Mundo> mundos, IEnumerable<Mundo> filtros)
        {
            var mundoFiltrado = new List<Mundo>();

            foreach (var item in filtros)
            {
                mundoFiltrado.AddRange(mundos.Where(
                    m => m.ContinenteId == item.ContinenteId &&
                    m.MundoId == item.MundoId &&
                    m.PaisId == item.PaisId &&
                    m.UFId == item.UFId
                ));
            }

            return mundoFiltrado;
        }
    
01.06.2017 / 14:17