Linq按布尔顺序排序

时间:2011-03-23 16:05:05

标签: c# linq

我有一个linq查询,我想通过f.bar订购,这是一个字符串,但我也想先通过f.foo订购它,这是一个布尔字段。喜欢下面的查询。

(from f in foo
orderby f.foo, f.bar
select f)

虽然这个编译它不能按预期工作。它只是通过f.bar命令忽略布尔字段。

我知道自己很愚蠢,但是我需要做些什么来解决这个问题呢?

由于

4 个答案:

答案 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();