如何更改默认的 OrderBy 功能,使其首先按给定值排序?
我有一组从 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
试试这个:
这依赖于早于“真”排序的“假”排序 - 我认为它会起作用......至少在 LINQ to Objects 中是这样。
Try this:
That relies on "false" ordering earlier than "true" - I think it will work... it would in LINQ to Objects, at least.
创建您自己的比较器,并将其作为 OrderBy 或 ThenBy 的第二个参数。
用户 OrderBy 的方式依赖于默认比较器,它通常比较字符串。但您可以创建自己的,它总是首先返回“6”。
附言。是的,这不能直接在 LINQ2SQL 上运行。但是,无论如何,您都会加载所有值。您可以先加载它们,然后在内存中排序。
下面是一个示例:
需要 .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:
.AsEnumerable() is needed in order for LINQ2SQL to load the data into memory.