对于我的应用程序,我想根据当前的Item
类型,通过静态字典值对Item
个实体进行排序。
无论我尝试什么,我都无法使它工作,总是得到一个错误说:
无法创建类型'System.Collections.Generic.KeyValuePair`2 [[MyApp.Models.Item + ItemTypeE,MyApp,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null],[系统]的常量值.Int32,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]'。此上下文仅支持原始类型或枚举类型
这是我的存储库方法,试图对Item
实体进行排序:
private IOrderedQueryable<Item> Sort(IQueryable<Item> items)
{
return items.OrderBy(i => i.Type)
.ThenBy(i =>
Item.MyDic.Keys.Any(key => key == i.Type)
? Item.MyDic[i.Type].Item2
: -1);
}
Item
类:
public partial class Item : CavalenaEntity, ICavalenaEntity
{
public enum ItemTypeE
{
Type1 = 0,
Type2 = 1,
...
}
public static Dictionary<ItemTypeE, Tuple<int, int>> MyDic = new Dictionary<ItemTypeE, Tuple<int, int>>()
{
{ ItemTypeE.Type1, new Tuple<int, int>(0, 1) },
{ ItemTypeE.Type2, new Tuple<int, int>(1, 100) },
...
}
}
Item.MyDic.Keys.Any(key => key == i.Type)
工作正常,但我找不到像Item.MyDic[i.Type].Item2
这样的方法。
我尝试将KeyValuePair
选为新的匿名对象,也尝试使用selectMany
,但我仍然无法使其正常工作。
如果有人能告诉我实现此类查询的方法,我将非常感激。 非常感谢。
最终解决方案
public IPagedList<Item> GetSoldableItems(Item.SortableTypeE sortName, SortOrder.TypeE sortOrder, int pageNb)
{
var items = entities.Items.Where(i => ...);
var orderedItems = Sort(items.AsEnumerable(), sortName, sortOrder).ToList();
return orderedItems.ToPagedList(pageNb, 10);
}
private IOrderedEnumerable<Item> Sort(IEnumerable<Item> items, Item.SortableTypeE sortName, SortOrder.TypeE sortOrder)
{
IOrderedEnumerable<Item> result = null;
switch(sortName)
{
case Item.SortableTypeE.Type:
result = sortOrder == SortOrder.TypeE.ASC
? items.OrderBy(i => i.Type)
: items.OrderByDescending(i => i.Type);
result = result.ThenBy(i =>
Item.MyDisc.ContainsKey(i.Type)
? Item.MyDisc[i.Type].Item2
: -1)
.ThenByDescending(i => i.Bonus);
break;
...
default: break;
}
return result;
}
答案 0 :(得分:1)
问题是提供程序正在尝试将查询转换为SQL,但是由于您在排序逻辑中使用了本地内存中的字典,因此无法执行此操作。解决方案是拖动数据并在内存中对其进行排序。由于此处没有过滤,因此从性能方面来看应该没问题:
private IEnumerable<Item> Sort(IQueryable<Item> items)
{
return items.AsEnumerable().OrderBy(i => i.Type)
.ThenBy(i => Item.MyDic.Keys.Any(key => key == i.Type)
? Item.MyDic[i.Type].Item2: -1);
}
注意其他情况:避免在其后面有过滤逻辑时使用AsEnumerable()
,因为这样您就不会在服务器端进行过滤。