使用 lambda 表达式和 Include 方法对查询进行排序



我正在处理实体框架核心 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标识。此字段的值等于FieldSetGroupId

因此,如果您有 Id = 10 的FieldSetGroup,并且这个FieldSetGroup有 1000FieldSets,那么每个FieldSet的值都是外键FieldSetGroupId10。无需将此值传输 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(。查询后对数据进行排序。

最新更新