0

我在 C# 中有一个沼泽标准列表:列表(其中 Channel 是电视频道)。通道定义为:

public class Channel
{
    public int ChannelId { get; set; }
    public string ChannelName { get; set; }
}

我的 ORM 填充了一个频道列表,该列表来自数据库中的频道 ID 顺序。我需要根据新的自定义排序属性重新排序列表,比如 ChannelOrder,但我无法修改底层数据库。

关于如何在不修改底层数据库的情况下执行此操作的任何想法?

因此,例如,如果我当前来自数据库:

ChannelId = 1,ChannelName =“BBC1”,ChannelId = 2,ChannelName =“BBC2”,ChannelId = 3,ChannelName =“ITV”

我可能希望它们订购为 BBC2、BBC1、ITV,基本上是定制订单。

4

2 回答 2

2

如果您乐于在进程中执行此操作(而不是作为查询的一部分),您可以使用:

var orderedChannelNames = new[] { "BBC2", "BBC1", "ITV", ... };
var sorted = unsorted.OrderBy(ch => orderedChannelNames.IndexOf(ch.ChannelName));

或者,如果您知道列表中的所有频道都将出现:

var map = unsorted.ToDictionary(ch => ch.ChannelName);
var sorted = orderedChannelNames.Select(name => map[name]);
于 2013-07-25T14:53:57.743 回答
0

您可以使用另一个返回“附加”属性的类,有点像 WPF 中的附加属性:

public static class ChannelSort
{
    static Dictionary<Channel, int> _dict = new Dictionary<Channel, int>();
    public static int GetSort(this Channel c)
    {
        return _dict[c] //will throw if key's not found,
        //may want to handle it for more descriptive exception
    }
    public static int SetSort(this Channel c, int sort)
    {
        _dict[c] = sort;
    }
}

然后你可以这样做:

var result = unsortedList.OrderBy(c => c.GetSort());
于 2013-07-25T14:55:22.343 回答