Linq order by boolean

У меня есть запрос linq, который я хочу заказать по f.bar, который является строкой, но я также хочу заказать его с помощью f.foo, который является булевским полем. Как и запрос ниже.

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

Хотя этот компилятор работает не так, как ожидалось. Он просто заказывает f.bar, игнорируя логическое поле.

Я устал, я знаю, но что мне нужно сделать, чтобы добиться этого?

Спасибо

Ответ 1

Это должно работать нормально - оно должно сначала упорядочить объекты с 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);
        }
    }

}

Ответ 2

Просто хотел сделать это, и это похоже на что-то, не имеющее неявного упорядочения. Я сделал следующее, чтобы быть более явным:

Something.OrderBy(e=>e.SomeFlag ? 0 : 1) 

чтобы отсортировать что-то истинное с ложным.

Ответ 3

Для того, чтобы быть более явным об используемом порядке.

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; 
    }
}

Ответ 4

Пожалуйста, попробуйте следующий код, если вы получите список по истине.

db.member.where(x=>x.id==memberId).OrderBy(x=>!x.IsPrimary?1:0).ToList();