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