我正在处理实体框架核心 2.0 查询。查询需要按"顺序"字段对 2 个表进行排序。到目前为止,这就是我所拥有的:
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);
此查询返回异常: "属性表达式 'e => {from Fieldset o in e.Fieldsets orderby [o]。订单 asc 选择 [o]}' 无效。表达式应表示属性访问:'t => t.MyProperty'。有关包含相关数据的详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkID=746393。
如何对 2 个表进行排序?
数据库查询中较慢的部分之一是将所选数据从 DBMS 传输到本地进程。因此,限制传输的数据量是明智的。
显然您的FieldSetGroup
有零个或多个FieldSets
.每个FieldSet
只属于一个FieldsetGroup
。这由外键FieldSetGroupId
标识。此字段的值等于FieldSetGroup
的Id
。
因此,如果您有 Id = 10 的FieldSetGroup
,并且这个FieldSetGroup
有 1000FieldSets
,那么每个FieldSet
的值都是外键FieldSetGroupId
10。无需将此值传输 1000 次。
建议:要限制传输的数据量,避免传输超过需要的数据,请使用
Select
而不是Include
,并且仅选择您实际计划的数据 用。如果您计划更新提取的数据,请使用Include
。
如果您使用Select
,您可以订购任何您想要的东西:
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();
你不能在Include
方法中进行排序(OrderBy
(。查询后对数据进行排序。