我有一组从Linq到SQL查询返回的结果。每个结果都有Name
和SeriesId
。 SeriesId
可以是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开始?
答案 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将数据加载到内存中。