【问题标题】:Ordering query using lambda expression and Include method使用 lambda 表达式和 Include 方法排序查询
【发布时间】:2019-03-03 09:48:09
【问题描述】:

我正在处理 Entity-Framework-Core 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].Order asc select [o]}' 无效。表达式应表示属性访问:'t => t.MyProperty'。有关包含相关数据的更多信息,请参阅http://go.microsoft.com/fwlink/?LinkID=746393。”

如何对 2 个表进行排序?

【问题讨论】:

  • 您不能在Include 内订购
  • 那么,我应该把它放在哪里?
  • 要么使用 .Join 方法,该方法允许您加入修改后的 DbSet/IQueryables,要么在检索对象后对导航属性进行排序。

标签: entity-framework entity-framework-core


【解决方案1】:

数据库查询中较慢的部分之一是将您选择的数据从 DBMS 传输到本地进程。因此,明智的做法是限制传输的数据量。

显然您的FieldSetGroup 有零个或多个FieldSets。每个FieldSet 恰好属于一个FieldsetGroup。这由外键FieldSetGroupId 标识。该字段的值等于FieldSetGroupId

所以如果你有FieldSetGroupid = 10,而这个FieldSetGroup有1000个FieldSets,那么每个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();

【讨论】:

    【解决方案2】:

    您不能在 Include 方法内进行排序 (OrderBy)。查询后对数据进行排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多