Expresión Lambda: cláusula where para Incluir la lista de

Así que me puse algo como esto:

var myObj = db.SomeObject
              .Include("Tasks")
              .SingleOrDefault(x => x.Id == someObjectId);

if (myObj != null)
{
    myObj.Tasks = myObj.Tasks.OrderBy(x => x.Number).ToList();
}

Aquí quiero ser capaz de poner una condición (where) en mi Incluir, por ejemplo:
.where task.IsDeleted == false

Hasta este momento no he encontrado una solución.

Soy consciente del hecho de que podía usar el where junto con el lugar donde yo fin de las tareas, pero esto, sin embargo, no se ejecuta en la base de datos, pero en lugar de los usos de la memoria. Quiero que se ejecute en la base de datos.

¿Alguien sabe cómo puedo hacer esto?
Si es así, ¿hay una manera de poner el order by condición a la inclusión de la lista de tareas?

No creo que sea posible.
¿Por qué no acaba las tareas? Y, a Continuación, Sólo un objeto sin las tareas?
¿a qué te refieres?

OriginalEl autor Tikkes | 2013-04-04

4 respuestas

  1. 5

    Algo como esto, returs su objeto original con su colección infantil filtrados y ordenados.

    SomeObject a = db.SomeObjects.Where(x => x.Id == someobjectid)
                          .Select(
                              x =>
                              new
                                  {
                                      someObject = x,
                                      task = x.Tasks.Where(task => task.IsDeleted == false)
                                                    .OrderBy(task => whatever)
                                  })
                          .Select(x => x.someObject).Single();

    Es realmente perder la colección de actividades en los últimos seleccione modo que usted puede hacer esto :

    SomeObject a = db.SomeObjects.Where(x => x.Id == someobjectid)
                          .Select(
                              x =>
                              new
                                  {
                                      someObject = x,
                                      task = x.Tasks.Where(task => task.IsDeleted == false)
                                                    .OrderBy(task => whatever)
                                  });
     return a.FirstOrDefault().someObject;
    Esta realidad hace el trabajo y me da el objeto original, de hecho. Gracias!

    OriginalEl autor Skyp

  2. 5

    Para ello es EF, es necesario especificar una proyección con un Select cláusula.

    Algo como esto va a obtener sólo los datos que desee de la db:

    var anonymous = db.SomeObject.Where( x => x.Id == someObjectId )
      .Select( x => new
        {
          SomeObject = x,
          Tasks = x.Tasks
            .Where( o => !o.IsDeleted )
            .OrderBy( o => ... )
        }
      )
      .SingleOrDefault()
    ;

    Usted va a terminar con una instancia del tipo anónimo , pero se puede arreglar fácilmente que en el cliente:

    MyObject myObject = anonymous.SomeObject;
    myObject.Tasks = anonymous.Tasks;
    Esto podría ser un trabajo, solo probando algunas cosas con esto todavía.
    Funciona! Gracias!
    FYi-si usted no quiere tratar con objetos anónimos, puede convertir explícitamente a un modelo que en su Seleccione vía .Seleccione( x=> nuevo YourModelClass

    OriginalEl autor Nicholas Butler

  3. 2

    La respuesta es simple: Usted no puede hacer eso.

    ¿Por qué? Debido a que usted consulta SomeObject.

    Cada uno regresó SomeObject contiene todos los datos de referencia, porque si no no representan el objeto real en la base de datos.

    Entonces, ¿cuál sería una mejor manera de enfoque? desde que tengo por ejemplo 1000 tareas y no quiero cargar todas ellas, pues, decir, 600 tiene la IsDeleted indicador establecido para true
    Creo que quiere una proyección en ese caso. Nicholas Butler se muestra un ejemplo de la fe.

    OriginalEl autor Daniel Hilgarth

  4. 1

    ¿Qué acerca de la obtención de ellos por separado:

    var myObj = db.SomeObject
                  .SingleOrDefault(x => x.Id == someObjectId);
    
    
    var tasks = db.SomeObject
                  .Where(x => x.Id == someObjectId)
                  .SelectMany(x => x.Tasks)
                  .Where(x => !x.Deleted);

    OriginalEl autor lahsrah

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *