【问题标题】:LINQ ordering by a child valueLINQ 按子值排序
【发布时间】:2015-03-20 08:46:38
【问题描述】:

我有一个看起来像这样的 EF 模型:

public class MetaData
{
    public ICollection<MetaDataDictionary> MetaDataDictionary { get; set; }
}

public partial class MetaDataDictionary
{
    public string Key { get; set; }
    public string Value { get; set; }
}

public List<MetaData> MetaDataList { get; set; }

...所以我可以有一个像这样的实例:

MetaDataList 
  MetaData1
    MetaDataDictionary          
      { key = "aaa", value = "4" }
      { key = "bbb", value = "5" }     
      { key = "ccc", value = "6" }     
  MetaData2
    MetaDataDictionary 
      { key = "aaa", value = "1" }
      { key = "bbb", value = "2" }     
      { key = "ccc", value = "3" }              

目标是根据 MetaDataDictionary 的特定键(例如键“aaa”)的值对 MetaDataList 进行排序,输出应为:

MetaDataList 
  MetaData1
    MetaDataDictionary          
      { key = "aaa", value = "1" }
      { key = "bbb", value = "2" }     
      { key = "ccc", value = "3" }     
  MetaData2
    MetaDataDictionary 
      { key = "aaa", value = "4" }
      { key = "bbb", value = "5" }     
      { key = "ccc", value = "6" }   

如您所见,它现在按键“bbb”的值排序。

我试过了:

var sorted = metaDataList.OrderBy(md => md.MetaDataDictionary.Select(mdd => mdd.Key == "aaa").Single()).ToList();

...但它抱怨“DbSortClause 表达式必须具有可比顺序的类型”。

有什么方法可以完成这项工作吗?

谢谢!

编辑:刚刚试过这个:

var sorted = metaDataList.OrderBy(md => md.MetaDataDictionary.Where(mdd => mdd.Key == "aaa").Select(mdd => mdd.Value).FirstOrDefault()).ToList();

似乎可行,但如果有人有更好的解决方案,请随时分享:)

【问题讨论】:

  • 你的已经是最短的形式了。您可以尝试.OrderBy(md =&gt; md.MetaDataDictionary.FirstOrDefault(mdd =&gt; mdd.Key == "aaa").Value)(SQL 查询不会抛出NullReferenceException :-))但我不确定它是否与EF“兼容”
  • 我的最佳猜测:var sorted = metaDataList.Select(md=&gt;md.MetaDataDictionary.OrderBy(mdd=&gt;mdd.Key));
  • 再看一遍,您的数据没有按特定键排序。它们按值排序。所以,第二个猜测是:var qry = MetaDataList.SelectMany(x=&gt;x.MetaDataDictionary.Select(y=&gt;y)).OrderBy(a=&gt;a.Value);

标签: c# linq entity-framework


【解决方案1】:

也许是这个?

metaDataList.OrderBy(md => md.MetaDataDictionary.First(mdd => mdd.Key == "aaa").Value)
            .ToList();

我尚未对其进行测试,但相信它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2017-10-15
    • 1970-01-01
    相关资源
    最近更新 更多