按静态字典值

时间:2016-09-03 10:37:49

标签: c# linq sorting dictionary

对于我的应用程序,我想根据当前的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;
    }

1 个答案:

答案 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(),因为这样您就不会在服务器端进行过滤。