developer tip

부울에 의한 Linq 순서

copycodes 2020. 8. 14. 07:56
반응형

부울에 의한 Linq 순서


문자열 인 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 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);
        }
    }

}

그냥 이것을하고 싶었고 암시적인 순서가없는 것처럼 보입니다. 더 명확하게하기 위해 다음을 수행했습니다.

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

참에서 거짓으로 분류합니다.


사용되는 순서에 대해 더 명확하게하기 위해.

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

목록 순서가 true이면 다음 코드를 시도하십시오.

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

참고 URL : https://stackoverflow.com/questions/5408177/linq-order-by-boolean

반응형