none
Not Contains in coleccion LINQ RRS feed

  • Pregunta

  • buenos dias ! 

    tengo un linq que trae los pilotos que no estén en una colección. como puedo hacer esto? 

    el código que tengo hasta ahora es 

    var listOfWinnersPro = (from p in grev.TblGanadoresRunking
                                           where p.IdTipoRunking == 1
                                           select  p.Pilotid ).ToList();
                   
                   var query = (from pilot in grev.Pilotos
                                where pilot.activo == true
                                && (pilot.TblTrackerOnline.Sum(i => i.PuntosPro) > 0)
                                && !pilot.PilotId.Contains(listOfWinnersPro)                         aca tendria que controlar que los id no esten en la otra coleccion
                                orderby pilot.TblTrackerOnline.Sum(i => i.PuntosPro) descending
                                select new
                               {
                                   //pilotId = !strGanadores.Contains(pilot.PilotId),
                                   Callsing = pilot.CallSing,
                                   Nombre = pilot.Name,
                                   PuntosPro = pilot.TblTrackerOnline.Where(
                                   (j => (j.FechaTrack.Value.Year == DateTime.Now.Year &&
                                       j.FechaTrack.Value.Month == 2 && j.PuntosPro > 0) &&
                                       j.TblEstados.IdEstado == 2 &&
                                       j.PuntosPro > 0
                                       )
                                   ).Sum(i => i.PuntosPro)
                               }).Take(10);

                   GrvActualPro.DataSource = query;
                   GrvActualPro.DataBind();


    Desde ya muchisimas Gracias! 

    jueves, 28 de junio de 2012 20:01

Respuestas

  • Despues del Take(10) escribe .ToList() para que se ejecute la query contra la base de datos y asi la query2 se realizará en memoria.

    Vota mi respuesta si te ha sido útil. Gracias.

    • Marcado como respuesta Greevard Dem domingo, 1 de julio de 2012 4:28
    • Desmarcado como respuesta Greevard Dem domingo, 1 de julio de 2012 4:28
    • Marcado como respuesta Greevard Dem domingo, 1 de julio de 2012 4:29
    sábado, 30 de junio de 2012 18:03
  • podrias usar

    var query2 = from pWin in query.ToList()
                                where !listOfWinnersPro.Contains(pWin.pilotId)
                                select pWin;

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta Greevard Dem domingo, 1 de julio de 2012 4:29
    domingo, 1 de julio de 2012 3:47

Todas las respuestas

  • no has probado al contrario

    usar

    && !listOfWinnersPro.Contains(pilot.PilotId)


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 28 de junio de 2012 22:31
  • Hola leandro , buenos dias! 

    si lo pongo al revez me da este error

    LINQ to Entities does not recognize the method 'Boolean Contains(System.String)' method, and this method cannot be translated into a store expression.

    y si lo dejo como esta  esta me dice que no puedo contener un a colección que debe ser solo un string

    Muchas gracias! 


    Demian

    viernes, 29 de junio de 2012 12:27
  • el tema es que no es un problema de linq sino de linq entities, porque quiere transformar eso a una query de sql

    pero que pasa si haces la query

     var query = (from pilot in grev.Pilotos
                                where pilot.activo == true
                                && (pilot.TblTrackerOnline.Sum(i => i.PuntosPro) > 0)
                           select pilot).ToList();

    cosa que ejecute la query sql contra la db y luego con el resultado aplcias una nueva

    var query2 = from pilot in query
                 !listOfWinnersPro.Contains(pilot.PilotId)
                 select ....

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 29 de junio de 2012 13:32
  • var query = (from pilot in grev.Pilotos
                                where pilot.activo == true
                                && (pilot.TblTrackerOnline.Sum(i => i.PuntosPro) > 0)
                                orderby pilot.TblTrackerOnline.Sum(i => i.PuntosPro) descending
                                select new
                               {
                                   pilotId = pilot.PilotId,
                                   Callsing = pilot.CallSing,
                                   Nombre = pilot.Name,
                                   PuntosPro = pilot.TblTrackerOnline.Where(
                                   (j => (j.FechaTrack.Value.Year == DateTime.Now.Year &&
                                       j.FechaTrack.Value.Month == 2 && j.PuntosPro > 0) &&
                                       j.TblEstados.IdEstado == 2 &&
                                       j.PuntosPro > 0
                                       )
                                   ).Sum(i => i.PuntosPro)
                               }).Take(10);


                   var query2 = from pWin in query
                                where !listOfWinnersPro.Contains(pWin.pilotId)
                                select pWin;


                   GrvActualPro.DataSource = query2;
                   GrvActualPro.DataBind();

    ERROR = LINQ to Entities does not recognize the method 'Boolean Contains(System.String)' method, and this method cannot be translated into a store expression.

    viernes, 29 de junio de 2012 13:45
  • Despues del Take(10) escribe .ToList() para que se ejecute la query contra la base de datos y asi la query2 se realizará en memoria.

    Vota mi respuesta si te ha sido útil. Gracias.

    • Marcado como respuesta Greevard Dem domingo, 1 de julio de 2012 4:28
    • Desmarcado como respuesta Greevard Dem domingo, 1 de julio de 2012 4:28
    • Marcado como respuesta Greevard Dem domingo, 1 de julio de 2012 4:29
    sábado, 30 de junio de 2012 18:03
  • podrias usar

    var query2 = from pWin in query.ToList()
                                where !listOfWinnersPro.Contains(pWin.pilotId)
                                select pWin;

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta Greevard Dem domingo, 1 de julio de 2012 4:29
    domingo, 1 de julio de 2012 3:47
  • Excelente ahi levanto, solo me falta saber porque uno viene vacio! sin puntos,, pero eso lo investigo 

    Gracias porla mano ! 

    domingo, 1 de julio de 2012 4:28