J'ai une requête linq que je veux commander par f.bar, qui est une chaîne, mais je veux aussi la commander par f.foo, qui est d'abord un champ booléen. Comme la requête ci-dessous.
(from f in foo
orderby f.foo, f.bar
select f)
Bien que cela compile, cela ne fonctionne pas comme prévu. Il ordonne simplement à f.bar d'ignorer le champ booléen.
Je suis stupide, je sais, mais que dois-je faire pour avoir ce comportement?
Merci
Cela devrait fonctionner correctement - les entités avec une valeur false
foo en premier doivent être classées en premier lieu, puis celles avec une valeur true
foo.
Cela fonctionne certainement dans LINQ to Objects - quel fournisseur LINQ utilisez-vous réellement?
Voici un exemple de LINQ to Objects qui fait travail:
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);
}
}
}
Je voulais juste faire cela et cela ressemble à quelque chose sans ordre implicite. J'ai fait ce qui suit pour être plus explicite:
Something.OrderBy(e=>e.SomeFlag ? 0 : 1)
trier quelque chose de vrai à faux.
Afin d'être plus explicite sur l'ordre utilisé.
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;
}
}