Sto lavorando su una query Entity-Framework-Core 2.0. La query deve ordinare 2 tabelle dal campo "ordine". Finora questo è quello che ho:
return await _context.FieldsetGroup
.Include(e => e.Fieldsets.OrderBy(o => o.Order))
.ThenInclude(e => e.FieldsetFields.OrderBy(o => o.Field.Order))
.ThenInclude(e => e.Field)
.FirstOrDefaultAsync(fsg => fsg.FieldsetGroupId == fieldSetGroupId);
Questa query restituisce un'eccezione: "L'espressione di proprietà 'e => {da Fieldset o in e.Fieldsets orderby [o] .Order asc select [o]}' non è valida. L'espressione deve rappresentare un accesso di proprietà: 't = > t.MyProperty. Per ulteriori informazioni sull'inclusione dei dati correlati, vedere http://go.microsoft.com/fwlink/?LinkID=746393 . "
Come posso ordinare i 2 tavoli?
Una delle parti più lente delle query del database è il trasporto dei dati selezionati dal DBMS al processo locale. Quindi è consigliabile limitare la quantità di dati trasferiti.
Apparentemente il tuo FieldSetGroup
ha zero o più FieldSets
. Ogni FieldSet
appartiene a esattamente un FieldsetGroup
. Questo è identificato dalla chiave FieldSetGroupId
. Il valore di questo campo è uguale al Id
del FieldSetGroup
.
Quindi se hai FieldSetGroup
con Id = 10 e questo FieldSetGroup
ha, 1000 FieldSets
, allora ogni FieldSet
avrà un valore di chiave FieldSetGroupId
di 10. Non c'è bisogno di trasferire questo valore 1000 volte.
Consiglio: per limitare la quantità di dati trasferiti, evitare di trasferire più dati del necessario, utilizzare
Select
invece diInclude
e selezionare solo i dati che si prevede di utilizzare. UtilizzareInclude
se si prevede di aggiornare i dati recuperati.
Se usi Select
, puoi ordinare quello che vuoi:
var result = dbContext.FieldsetGroup
.Where((fieldSetGroup => fieldSetGroup.FieldsetGroupId == fieldSetGroupId)
.Select(fieldSetGroup => new
{
... // select the fieldSetGroup properties you plan to use
FieldSets = fieldSetGroup.FieldSets
.OrderBy(fieldSet => fieldSet.Order)
.Select(fieldSet => new
{
... // only select the fieldSet properties you plan to use
FieldSetFields = fieldSet.FieldSetFields
.OrderBy(fieldSetField => fieldSetField.Order)
.Select(fieldSetField => new
{
...
})
.ToList(),
})
.ToList(),
})
.ToList(),
})
.FirstOrDefault();
Non è possibile eseguire l'ordinamento ( OrderBy
) all'interno del metodo Include
. Ordina i dati dopo la query.