IT story

LINQ : 점 표기법과 쿼리 식

hot-time 2020. 12. 30. 19:18
반응형

LINQ : 점 표기법과 쿼리 식


일반적으로 LINQ를 사용하기 시작했습니다 (지금까지 toXML 및 toSQL). 나는 때때로 동일한 결과를 얻는 두 가지 이상의 방법이 있음을 보았다. 내가 이해하는 한이 간단한 예를 들어 두 가지 모두 똑같은 결과를 반환합니다.

SomeDataContext dc = new SomeDataContext();

var queue = from q in dc.SomeTable
        where q.SomeDate <= DateTime.Now && q.Locked != true
        orderby (q.Priority, q.TimeCreated)
        select q;

var queue2 = dc.SomeTable
        .Where( q => q.SomeDate <= DateTime.Now && q.Locked != true )
        .OrderBy(q => q.Priority)
        .ThenBy(q => q.TimeCreated);

아이디어는 같은 것을 표현하는 두 가지 방법이 있다는 것입니다. 첫 번째 방법에는 몇 가지 제한 사항이 있고 "점 표기법"이 더 완벽하다는 것을 알고 있지만 그 외에 다른 이점이 있습니까?


"점"표기법은 일반적으로 Lambda 구문이라고합니다. 첫 번째 표기법에는 여러 이름이 있지만 일반적으로 쿼리 구문이라고합니다.

저는 10 명의 개발자로 구성된 팀에서 일하고 있으며 표준으로 사용해야 할 것에 대해 길게 논쟁합니다. 일반적으로 노련한 (LINQ 사용) 개발자는 Lambda 구문으로 마이그레이션하지만 중요한 예외가 있습니다.

Lambda는 더 간결하지만 다중 테이블 조인을 수행하는 것은 악몽입니다. 조인은 쿼리 구문으로 훨씬 더 깔끔합니다. 반대로, Lambda 구문 내에 만 존재하는 Single (), First (), Count () 등 LINQ 작업이 많이 있습니다.

따라서 가장 편하게 느끼는 것을 사용하고 경험을 쌓을수록 선호도가 바뀔 가능성이 있음을 인식하십시오. 둘 다 읽을 수 있다는 것은 큰 가치가 있으며 둘 다 조금만 사용해야하는 상황도있을 것입니다. 다른 상황은 그들 자신을 다른 스타일보다 한 스타일에 빌려줄 것입니다. 결국 모든 것이 동일한 실행 코드로 변환됩니다.


나는 경우에 따라 내 쿼리에 대해 더 읽기 쉬운 구문을 사용합니다.

가능하면 두 가지를 혼합하고 일치시키는 것을 피하려고 노력하지만 때로는 괜찮습니다 ( First()예를 들어 쿼리 끝에서 단일 호출 인 경우 ). 지연된 실행은 쿼리 식을 사용하고 결과를 변수에 할당 한 다음 해당 변수를 사용하여 점 표기법을 사용하는 것만 큼 효율적임을 의미합니다 .

var query = from x in y
            orderby z
            group x by x.Name into groups
            // etc
            select foo;

var page = query.Skip(50).Take(10);

다른 사람들이 말했듯이 쿼리 식은 쿼리 식없이 "일반적인"C # 3으로 변환되므로이 작업에 대한 패널티가 없습니다.


음, '점'표기법은 훨씬 더 짧을 수 있습니다. 취하다:

var result = from p in dc.Products
             where p.Id > 5
             select p;

또는:

var result = dc.Products.Where(p => p.Id > 5);

후자가 훨씬 짧고 읽기 쉬우므로 선호합니다.


나는 Lambda 표기법이 더 깔끔하고 간결하다고 생각합니다. 난 그냥 당신이 람다 표현이있는 경우 그것이 성가신 찾아 어디 메서드 호출 내부를, 당신이 디버그 모드에서 즉시 코드를 수정할 수 없습니다 ...


그들은 동일한 코드로 컴파일되거나, 오히려 첫 번째 코드가 먼저 두 번째 코드로 변환 된 다음 컴파일됩니다.

차이점은 첫 번째 버전이 더 깨끗하지만 더 제한적이라는 것입니다. 두 번째에서는 예를 들어 이미 존재하는 델리게이트를 사용할 수 있습니다. 예 :

Func<int, bool> isEven = i => i%2 == 0;
Enumerable.Range(10).Where(isEven).ToList().ForEach(Console.WriteLine);

참조 URL : https://stackoverflow.com/questions/630045/linq-dot-notation-vs-query-expression

반응형