El Pedido de Entity Framework Incluye


Estoy tratando de hacer que funcione algo como lo siguiente:

_dbmsParentSections = FactoryTools.Factory.PdfSections
                        .Include(x => x.Children.OrderBy(y => y.Order).ToList())
                        .Include(x => x.Hint).Include(x => x.Fields)
                        .Where(x => x.FormId == FormId && x.Parent == null)
                        .OrderBy(o => o.Order)
                        .ToList();

La parte que causa la excepción es:

.Include(x => x.Children.OrderBy(y => y.Order).ToList())

EDITAR:

Tras una observación posterior,

_dbmsParentSections.ForEach(x => x.Children = x.Children.OrderBy(y => y.Order).ToList());

Hizo el trabajo por mí (después de la llamada inicial Factory y sin la Children.OrderBy).

Author: Serj Sagan, 2013-03-13

5 answers

Parece que no puede ordenar la colección de hijos en su consulta. Ordenar después de la consulta o cargar los hijos en una segunda consulta.

Pregunta y respuesta similares aquí

 30
Author: Olav Nybø,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:17

El método de extensión Include es una mera envoltura alrededor DbQuery.Include. Internamente no ejecutalas expresiones, sino que solo las analiza, es decir, toma sus expresiones miembro y las convierte en una ruta como cadena. La ruta se utiliza como entrada para DbQuery.Include.

Se ha solicitado anteriormente para mejorar la funcionalidad de Include, por ejemplo, para permitir colecciones parcialmente cargadas mediante la inclusión de una cláusula Where. El pedido podría ser otra solicitud de cambio. Pero como ves, debido a habrá que reestructurar el funcionamiento interno de Include todo el mecanismo para aplicar esas mejoras. No lo veo en la actual hoja de ruta así que puede tomar un tiempo...

 11
Author: Gert Arnold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-13 15:17:20

Esto nunca va a funcionar. EF include es tratar de entender y traducir todo a SQL, pero desea mucho de esto. Cargar todas las entidades sin ordenar y .ToList () - ing, y escribe un método de extensión para Iumerable para obtener un resultado ordenado.

 1
Author: Peter Kiss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-13 06:18:34

Generalmente, si está utilizando un montón de includes, es porque necesita acceder a las propiedades secundarias en una vista. Lo que hago es ordenar la colección del niño cuando necesito acceder a ella en una vista.

Por ejemplo, podría construir algunas instrucciones Include para un formulario maestro/detalle. No tiene sentido ordenar esto en la consulta EF inicial. En su lugar, ¿por qué no ordenar estos registros secundarios en el nivel de vista cuando realmente está accediendo a ellos?

Podría tener una encuesta con múltiples encuestas pregunta. Si quiero presentar las preguntas en un orden particular en hacerlo en el nivel de vista parcial cuando estoy pasando la colección hija del modelo a la vista parcial.

@Html.Partial("_ResponsesPartial",Model.SurveyResponses.OrderBy(x => 
x.QuestionId))
 0
Author: Charles Owen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-09 21:48:50

No debe convertir un tipo IQueryable a IEnumerable y llamar a Include porque Include no es compatible con IEnumerable type.

En resumen, nunca llame a Include después de ToList

IQueryable = server side call (SQL)
IEnumerable = client side (loaded in memory)
 -2
Author: user6314169,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-10 09:28:41