You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用LINQ按Features.ID=2的Feature_Value对嵌套对象Articles排序

按指定Feature排序Articles

背景代码与数据结构

定义的DbSet:

public virtual DbSet<Groups> Groups { get; set; }

获取目标Group的代码:

var group = context.Groups.Single(s => s.Group_ID == details.Id);

简化后的数据结构:

Group
{
    int Group_ID
    string Group_Name
    List<Articles> Articles
}

Articles
{
   int Article_ID
   string Article_Name
   List<Features> Features
}

Features
{
   int ID
   string Feature_Name
   string Feature_Value
}

当前返回View的代码:

return View("GroupDetails", group.Articles);

问题需求

需要用LINQ对group.Articles按照Features.ID == 2对应的Feature_Value进行排序,此前尝试的代码无法生效:

var result = group.Articles.OrderBy(a => a.Features.Where(f => f.Feature_ID == 2).Select(f => f.Feature_Value))

解决方案

问题原因

之前的代码中,Where(...).Select(...)返回的是集合类型(IEnumerable<string>),但OrderBy需要单个排序键,而非集合,因此无法正常排序。

正确写法

假设每个Article对应ID=2的Feature最多有一个,使用FirstOrDefault获取单个排序值:

var sortedArticles = group.Articles
    .OrderBy(a => a.Features.FirstOrDefault(f => f.ID == 2)?.Feature_Value);

变体说明

  • 若需降序排序,替换为OrderByDescending即可。
  • 若业务上确保每个Article都存在ID=2的Feature,可去掉空引用运算符?,避免额外的空值判断:
    var sortedArticles = group.Articles
        .OrderBy(a => a.Features.First(f => f.ID == 2).Feature_Value);
    
  • 若存在单个Article对应多个ID=2的Feature(业务场景罕见),可按需取第一个、最后一个或拼接值排序,例如取第一个匹配值:
    var sortedArticles = group.Articles
        .OrderBy(a => a.Features.Where(f => f.ID == 2)
                                .Select(f => f.Feature_Value)
                                .FirstOrDefault());
    

替换返回代码

将排序后的集合传入View:

return View("GroupDetails", sortedArticles);

内容的提问来源于stack exchange,提问作者dan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 17:32:18