我首先使用EF代码处理ASP.NET MVC项目,我需要构建一个Linq expression
,以便根据静态字典值对Item
个实体进行排序。< / p>
public partial class Item
{
public enum TypeE
{
Type1,
Type2,
Type3,
Type4,
}
public TypeE Type { get; set; } // Mapped database column
public static Dictionary<TypeE, int> MyDic = new Dictionary<TypeE, int>()
{
{ TypeE.Type1, 42 },
{ TypeE.Type2, 16 },
{ TypeE.Type3, 0 },
{ TypeE.Type4, 34 },
};
}
我的最终目标是在Linq to entities
中使用某种方法,这样我就可以实现myEntities.OrderBy(i => Item.MyDic[i.Type])
之类的内容。
我确切地说,我无法使用AsEnumerable()
或其他任何枚举实体集合的内容,我真的需要在Linq to entities
中直接使用的内容。
我也想避免在数据库中创建参考表,我真的在寻找Linq expression
。
几天前,我问了一个非常相似的问题,关于如何通过枚举描述对实体进行排序,Ivan Stoev给出的答案(https://stackoverflow.com/a/40203664/2828106)完全实现了我想要的目标。
如果有一种方法可以将这种逻辑重用于这个新目的,那么这将是很好的但是我没有进行足够的实验,我在尝试时最终得到了无限循环。
非常感谢。
答案 0 :(得分:1)
以下是用于字典的相同方法:
public static class Expressions
{
public static Expression<Func<TSource, int>> DictionaryOrder<TSource, TKey, TOrder>(Expression<Func<TSource, TKey>> source, IReadOnlyDictionary<TKey, TOrder> by)
{
var body = by
.OrderBy(entry => entry.Value)
.Select((entry, ordinal) => new { entry.Key, ordinal })
.Reverse()
.Aggregate((Expression)null, (next, item) => next == null ? (Expression)
Expression.Constant(item.ordinal) :
Expression.Condition(
Expression.Equal(source.Body, Expression.Constant(item.Key)),
Expression.Constant(item.ordinal),
next));
return Expression.Lambda<Func<TSource, int>>(body, source.Parameters[0]);
}
}
和样本用法:
var order = Expressions.DictionaryOrder((Item x) => x.Type, Item.MyDic);