如何用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
相关产品推荐
相关产品推荐

