【发布时间】: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 => md.MetaDataDictionary.FirstOrDefault(mdd => mdd.Key == "aaa").Value)(SQL 查询不会抛出NullReferenceException:-))但我不确定它是否与EF“兼容” -
我的最佳猜测:
var sorted = metaDataList.Select(md=>md.MetaDataDictionary.OrderBy(mdd=>mdd.Key)); -
再看一遍,您的数据没有按特定键排序。它们按值排序。所以,第二个猜测是:
var qry = MetaDataList.SelectMany(x=>x.MetaDataDictionary.Select(y=>y)).OrderBy(a=>a.Value);
标签: c# linq entity-framework