【问题标题】:OrderBy clause breaks my controller in Entity Framework Core 3OrderBy 子句在 Entity Framework Core 3 中破坏了我的控制器
【发布时间】:2021-02-17 20:09:30
【问题描述】:

所以我有了这个运行良好的小控制器。唯一的问题是,StateLocation OrderId 在返回的字符串中乱序。

[HttpGet("GetLocationsByLanguageId/{id}")]
public async Task<ActionResult<IEnumerable<LanguageList>>> GetLocationsByLanguageId(Guid id)
{
    var choicesByLanguage = await _context.LanguageList.Where(q => q.LanguageId == id)
                    .Include(p => p.StateLocation)
                    .ToListAsync();
    return choicesByLanguage;
}

所以我去了 Microsoft Entity Framework 网站阅读有关订购的信息,发现:

https://docs.microsoft.com/en-us/ef/core/querying/related-data/eager

所以我添加了一个OrderBy 子句,如下所示:

[HttpGet("GetLocationsByLanguageId/{id}")]
public async Task<ActionResult<IEnumerable<LanguageList>>> GetLocationsByLanguageId(Guid id)
{
    var choicesByLanguage = await _context.LanguageList.Where(q => q.LanguageId == id)
                    .Include(p => p.StateLocation
                            .OrderBy(p => p.OrderId))
                            .ToListAsync();
    return choicesByLanguage;
}

我在构建时没有收到任何错误,但是当我尝试访问该站点时,我得到了这个:

“System.Linq.IOrderedQueryable”类型的表达式不能用于 返回类型'System.Linq.IOrderedEnumerable

所以我四处寻找,在这里找到了一些可能的解决方案:

OrderBy and List vs. IOrderedEnumerable

但这些都不起作用,它们只是产生了新的错误或原始错误的变体。

在使用 .Net Core 3 时,我无法找到任何有助于解决此问题的答案。大多数答案都是针对旧版本的。

有没有人能够解决这个 .Net Core Entity Framework 3.0?

谢谢!

型号:

public partial class LanguageList
{
    public LanguageList()
    {
        StateLocation = new HashSet<StateLocation>();
    }
    
    public Guid LanguageId{ get; set; }
    public string LanguageName { get; set; }

    public virtual ICollection<StateLocation> StateLocation { get; set; }
}

public partial class StateLocation
{
    public Guid StateId { get; set; }
    public Guid LanguageId { get; set; }
    public string StateName { get; set; }
    public string StateCapital { get; set; }
    public int OrderId { get; set; }

    public virtual LanguageList Language { get; set; }
}

【问题讨论】:

  • 你能显示 StateLocation 和 LanguageList 类吗?
  • 你能再检查一下你的语法吗?你在最后一个代码块中有一个) 太多
  • @Xerillio 哎呀,谢谢,当我在 SO 上输入它时只是一个错字。 :)
  • @Sergey 是的,刚刚添加!谢谢!
  • 不确定订购包含...

标签: c# entity-framework linq .net-core entity-framework-core


【解决方案1】:

试试这个:

return  await _context.LanguageList
                    .Where(q => q.LanguageId == id)
                    .Include(p => p.StateLocation.OrderBy(p => p.OrderId))
                     .ToListAsync();

您几乎要进行此查询,但是由于您将多余的“)”放在了错误的位置,因此出现了错误。

但如果你仍然使用 EF Core 3,你可以试试这个:

var query=  await _context.LanguageList
              .Where(q => q.LanguageId == id)
        .Select(p => new
        {
            P = p,
            C = p.StateLocation.OrderBy(p => p.OrderId))
        })
    .ToListAsync();

return  query
            .Select(g => g.P)
            .FirstOrDefault();

【讨论】:

  • 这真的支持吗? This 另有说明 - 虽然这是一篇旧帖子
  • 我想这就是我正在使用的?
  • @SkyeBoniwell AFAIK, .OrderBy() inside .Include() 是 EF Core 5.0 中引入的一项功能。
  • @atiyar 哦,我明白了,我使用的是 3.1。 3.1有没有办法做到这一点?谢谢 :(
【解决方案2】:

您提到您使用的是 EF Core 3,但是,the documentation 声明此功能是在 EF Core 5.0 中首次引入的。也就是说,您不能在单个查询中对相关数据执行 LINQ 操作。相反,您需要升级到 EF Core 5.0 或您的ToListAsync 调用之后执行排序。

EF Core 3 中的示例:

var choicesByLanguage = await _context.LanguageList.Where(q => q.LanguageId == id)
    .Include(p => p.StateLocation)
    .ToListAsync();

foreach (var lList in choicesByLanguage)
{
    lList.StateLocation = lList.StateLocation.OrderBy(p => p.OrderId).ToList();
}

【讨论】:

  • 我试过.ToListAsync().OrderBy(p =&gt; p.OrderId) ,但它不认识它
  • @SkyeBoniwell 我添加了一个示例。您的示例的问题在于 ToListAsync() 返回的列表 LanguageList 没有 OrderId 属性 - 它位于子对象中。
猜你喜欢
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
相关资源
最近更新 更多