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

发布于 2024-11-30 13:59:51 字数 743 浏览 0 评论 0原文

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

因此结果最初可能会像这样从数据库中出来(即任何顺序):

FundA1
FundA6
FundA4
FundC6
FundC3
FundC4
FundB2
FundB7
FundB8
FundB6

我需要首先按 Name 排序这些结果code>,然后通过 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 开始排序?

I have a set of results coming back from a Linq to SQL query. Each result has a Name and a SeriesId. The SeriesId can be any value from 1 to N,

So the results might initially come out of the database like this (i.e. any order):

FundA1
FundA6
FundA4
FundC6
FundC3
FundC4
FundB2
FundB7
FundB8
FundB6

I need to get these ordered first by Name, and then by SeriesId but I need to show SeriesId == 6 first, then the rest in any order.

So for example, I need

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

I know it's possible for me to order by Name and then SeriesId by doing this:

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

but this will order the SeriesId by the lowest value first. Is there a way for me to override this default functionality by specifying that it should order by SeriesId starting at 6 rather than 1?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

过去的过去 2024-12-07 13:59:51

试试这个:

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

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

Try this:

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

That relies on "false" ordering earlier than "true" - I think it will work... it would in LINQ to Objects, at least.

懒猫 2024-12-07 13:59:51
return queryable
    .OrderBy(f => f.Name)
    .ThenBy(f => f.SerialId == 6)
    .ThenBy(f => f.SeriesId);
return queryable
    .OrderBy(f => f.Name)
    .ThenBy(f => f.SerialId == 6)
    .ThenBy(f => f.SeriesId);
冷夜 2024-12-07 13:59:51

创建您自己的比较器,并将其作为 OrderBy 或 ThenBy 的第二个参数。
用户 OrderBy 的方式依赖于默认比较器,它通常比较字符串。但您可以创建自己的,它总是首先返回“6”。
附言。是的,这不能直接在 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 将数据加载到内存中。

Create your own comparer, and give it as a second parameter to OrderBy, ot ThenBy.
The way user OrderBy, you rely on default comparer, that compares strings normally. But you can create your own, that will always return "6" first.
PS. Yes this won`t work directly on LINQ2SQL. But, since, you are loading all the values anyway. You can first load them, and then sort in memory.

Here`s an example:

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() is needed in order for LINQ2SQL to load the data into memory.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文