我有一个linq查询,我想通过f.bar订购,这是一个字符串,但我也想先通过f.foo订购它,这是一个布尔字段。喜欢下面的查询。
(from f in foo
orderby f.foo, f.bar
select f)
虽然这个编译它不能按预期工作。它只是通过f.bar命令忽略布尔字段。
我知道自己很愚蠢,但是我需要做些什么来解决这个问题呢?
由于
答案 0 :(得分:155)
这应该可以正常工作 - 它应该首先命令false
foo值的实体,然后命令true
foo值的实体。
这肯定适用于LINQ to Objects - 您实际使用的LINQ提供程序是什么?
这是 工作的LINQ to Objects示例:
using System;
using System.Linq;
public static class Test
{
public static void Main()
{
var data = new[]
{
new { x = false, y = "hello" },
new { x = true, y = "abc" },
new { x = false, y = "def" },
new { x = true, y = "world" }
};
var query = from d in data
orderby d.x, d.y
select d;
foreach (var result in query)
{
Console.WriteLine(result);
}
}
}
答案 1 :(得分:96)
只是想这样做,似乎没有隐含的顺序。我做了以下更明确的事情:
Something.OrderBy(e=>e.SomeFlag ? 0 : 1)
将true转换为false。
答案 2 :(得分:0)
为了更明确地说明所使用的顺序。
Something.OrderBy(e => e.SomeFlage, new BooleanComparer());
public class BooleanComparer : IComparer<bool>
{
public int Compare(bool x, bool y)
{
int p = x ? 1 : 0;
int q = y ? 1 : 0;
return p - q;
}
}
答案 3 :(得分:0)
如果您通过true获得列表order,请尝试以下代码。
db.member.where(x=>x.id==memberId).OrderBy(x=>!x.IsPrimary?1:0).ToList();