Puedo acoplar los resultados de una colección infantil dentro de una colección con SelectMany:

 //a list of Foos, a Foo contains a List of Bars
 var source = new List<Foo>() { ... };

 var q = source.SelectMany(foo => foo.Bar)
     .Select(bar => bar.barId)
 .ToList();

esto me da la lista de todos los de la Barra de Ids en el Foo Lista. Cuando intento ir de tres en tres niveles de profundidad incorrecta se devuelve el resultado.

 var q = source.SelectMany(foo => foo.Bar)
     .SelectMany(bar => bar.Widget)
         .Select(widget => widget.WidgetId)
 .ToList();

Cómo debo utilizar SelectMany para obtener la lista de todos los Widgets en todos los Bares en mi lista de Foos?

Editar
Echo de menos a redactar la oración anterior, pero el código refleja el objetivo. Estoy buscando una lista de todos los Widget Id, no los widgets.

Una «incorrecta» el resultado no es todo lo del widget de devolver los identificadores.

Se ve bien para mí. «incorrecta se devuelve el resultado» no es un mensaje de error descriptivo, ¿qué haría usted, ¿y qué espera usted?

OriginalEl autor blu | 2009-03-12

3 Comentarios

  1. 32

    Su consulta es devolver todo el widget Id, en lugar de todos los widgets. Si sólo desea los widgets, sólo tiene que utilizar:

    var q = source.SelectMany(foo => foo.Bar)
                  .SelectMany(bar => bar.Widget)
                  .ToList();

    Si que sigue dando «el resultado incorrecto» por favor, explique en qué manera es el resultado incorrecto. Código de ejemplo sería muy útil 🙂

    EDIT: Bueno, si quieres el widget Id, su código original debe estar bien:

    var q = source.SelectMany(foo => foo.Bar)
                  .SelectMany(bar => bar.Widget)
                  .Select(widget => widget.WidgetId)
                  .ToList();

    Que también se podría haber escrito como

    var q = (from foo in source
             from bar in foo.Bar
             from widget in bar.Widget
             select widgetId).ToList();

    si te gusta la expresión de consulta en formato.

    Esto realmente debe funcionar – si es no de trabajo, que sugiere que hay algo mal con sus datos.

    Deberíamos de haber comprobado antes – se trata simplemente de LINQ to Objects, o un aficionado del proveedor (por ejemplo, LINQ to SQL)?

    Sí, quise decir que todos los Widget Id, Widgets no regresó. Cuando me de la cadena de SelectMany(…).SelectMany(…).Seleccione() la última seleccione no devuelve la lista de todos los Widget Id por alguna razón.
    Su LINQ to Objects. Bien, siempre y cuando la consulta se precisa en términos de cómo espero que el trabajo me puede acotar el tema a los datos y a partir de ahí, gracias.

    OriginalEl autor Jon Skeet

  2. 2
    var q = (
        from f in foo
        from b in f.Bars
        from w in b.Widgets
        select w.WidgetId
       ).ToList();

    También tenga en cuenta que si desea que la lista única, se puede hacer .Distintos().ToList() en su lugar.

    Eso suponiendo una sola Barra por Foo, y un solo Widget por Barra.
    pero ¿no es eso precisamente lo que está haciendo?
    No. Se trata de seleccionar múltiples Bares por Foo – que es lo que SelectMany.
    Véase el comentario: «un Foo contiene una Lista de los Bares». Su versión modificada es básicamente el mismo que el mío, sólo toma dos veces la cantidad de líneas de código (o tres veces si ToList() no es realmente necesario). A veces las expresiones de consulta son más problemas de lo que valen 🙂
    eso es correcto, no se usa para los modelos de decir foo.El Bar de la 1-n : (actualizado con sólo el 1-versión n.

    OriginalEl autor eglasius

  3. 1
           var q = source.SelectMany(foo => foo.Bar)
              .SelectMany(bar => bar.Widget,(bar,widget) => widget.WidgetId)
              .ToList();

    podemos llamar a esta sobrecarga de SelectMany() nos permite especificar la proyección utilizando lambda experession

    aquí nos acaban de llamar tres métodos en lugar de cuatro

    OriginalEl autor Abdalwhab Bakheet

Dejar respuesta

Please enter your comment!
Please enter your name here