如何更改默认的OrderBy功能,使其首先按给定值排序?

时间:2011-08-19 14:59:22

标签: c# linq linq-to-sql

我有一组从Linq到SQL查询返回的结果。每个结果都有NameSeriesIdSeriesId可以是1到N之间的任何值,

所以结果可能最初是从这样的数据库中出来的(即任何顺序):

FundA1
FundA6
FundA4
FundC6
FundC3
FundC4
FundB2
FundB7
FundB8
FundB6

我需要首先按Name订购这些订单,然后按SeriesId 订购,但我需要先显示SeriesId == 6,然后按任意顺序显示其余部分

所以,例如,我需要

**FundA6**
FundA1
FundA4
**FundB6**
FundB2
FundB7
FundB8
**FundC6**
FundC3
FundC4

我知道我可以通过Name然后SeriesId进行订购:

return queryable.OrderBy(f => f.Name).ThenBy(s => s.SeriesId));

但这将首先按SeriesId排序最低值。有没有办法让我覆盖这个默认功能,方法是指定它应该从SeriesId开始从6开始而不是1开始?

3 个答案:

答案 0 :(得分:4)

试试这个:

return queryable.OrderBy(f => f.Name)
                .ThenBy(f => f.SeriesId == 6 ? 0 : 1)
                .ThenBy(s => s.SeriesId));

依赖于“假”排序早于“真实” - 我认为它会起作用......它至少会在LINQ to Objects中出现。

答案 1 :(得分:3)

return queryable
    .OrderBy(f => f.Name)
    .ThenBy(f => f.SerialId == 6)
    .ThenBy(f => f.SeriesId);

答案 2 :(得分:0)

创建自己的比较器,并将其作为第二个参数提供给OrderBy,ot ThenBy。 用户OrderBy的方式,您依赖于默认比较器,通常比较字符串。但你可以创建自己的,总是先返回“6”。 PS。是的,这不会直接在LINQ2SQL上工作。但是,因为,无论如何,您正在加载所有值。您可以先加载它们,然后在内存中进行排序。

这是一个例子:

class Sample
{
    string[] strings = new[]{ "123","123456", "12345"};

    public void SampleMethod()
    {
        var res = strings.AsEnumerable().OrderBy(s => s.Length, new MyComparer());
    }

    class MyComparer : IComparer<int>
    {
        public int Compare(int x, int y)
        {
            if (x == 6) return -1;
            return x - y;
        }
    }
}

。需要使用AsEnumerable()才能使LINQ2SQL将数据加载到内存中。