文字列であるf.barで並べ替えるlinqクエリがありますが、最初にブールフィールドであるf.fooで並べ替えたいです。以下のクエリのように。
(from f in foo
orderby f.foo, f.bar
select f)
これはコンパイルされますが、期待どおりに動作しません。ブール値フィールドを無視してf.barで注文するだけです。
私は知っているふざけていますが、この振る舞いをするために何をする必要がありますか?
ありがとう
文字列であるf.barで並べ替えるlinqクエリがありますが、最初にブールフィールドであるf.fooで並べ替えたいです。以下のクエリのように。
(from f in foo
orderby f.foo, f.bar
select f)
これはコンパイルされますが、期待どおりに動作しません。ブール値フィールドを無視してf.barで注文するだけです。
私は知っているふざけていますが、この振る舞いをするために何をする必要がありますか?
ありがとう
回答:
それはうまくいくはずです-それはfalse
最初にfoo値を持つエンティティを順番に並べ、次にfoo値を持つエンティティを並べるべきtrue
です。
それは確かにLINQ to Objectsで機能します-どのLINQプロバイダーを実際に使用していますか?
ここではオブジェクトの例にLINQだし仕事は:
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);
}
}
}
false
(0)はtrue
(1)の前に昇順(デフォルト)でソートされています。
data.OrderBy(d => d.x).ThenBy(d => d.y)
これを実行したかっただけで、暗黙の順序付けがないもののようです。より明確にするために、次のことを行いました。
Something.OrderBy(e=>e.SomeFlag ? 0 : 1)
何かを真から偽にソートする。
true
意味することを非常によく知っているべきだと仮定するのは間違っていa single bit set to 1
ますか?私にとって、の真実はtrue > false
可能な限り明白です。
true > false
は広く知られているわけではありませんが、知られてい1 > 0
ます。
.OrderBy(e => e.SomeFlag == true)
と同等になる.OrderBy(e => e.SomeFlag)
のに対し、.OrderBy(e => e.SomeFlag ? 0 : 1)
同等です.OrderByDescending(e => e.SomeFlag)
。最初の2つはtrueの前にfalseをソートし、残りの2つはfalseの前にtrueをソートします。
リストorderby trueを取得する場合は、次のコードを試してください。
db.member.where(x=>x.id==memberId).OrderBy(x=>!x.IsPrimary?1:0).ToList();