[C#] LINQ의 가장 어렵거나 오해 된 부분은 무엇입니까? [닫은]

배경 : 다음 달에, 나는 적어도 LINQ에 관한 내용을 포함 해서 적어도 세 번의 연설을 할 것 입니다 C#. 사람들이 이해하기 어려울 수있는 부분 또는 잘못된 인상을 받았을 수있는 주제에 따라 어느 정도의 관심을 기울일 가치가 있는지 알고 싶습니다. 내가 특별히 얘기하지 않습니다 LINQSQL제외 쿼리가 원격으로 (보통과 표현의 나무를 사용하여 실행 할 수있는 방법의 예로 또는 엔티티 프레임 워크 IQueryable).

그래서 무엇에 대해 열심히 찾았 LINQ습니까? 오해의 관점에서 무엇을 보았습니까? 예는 다음 중 하나 일 수 있지만 자신을 제한하지 마십시오!

  • C#컴파일러가 쿼리 표현식을 처리 하는 방법
  • 람다 식
  • 표현 트리
  • 확장 방법
  • 익명 유형
  • IQueryable
  • 지연된 대 즉시 실행
  • 스트리밍 vs 버퍼 실행 (예 : OrderBy가 지연되었지만 버퍼링 됨)
  • 암시 적으로 입력 된 지역 변수
  • 복잡한 일반 서명 읽기 (예 : Enumerable.Join )


답변

실행 지연


답변

나는 지금까지 연기 된 실행 개념이 나에게 맞아야한다는 것을 알고 있지만,이 예제는 실제로 그것을 이해하는 데 도움이되었다.

static void Linq_Deferred_Execution_Demo()
{
    List<String> items = new List<string> { "Bob", "Alice", "Trent" };

    var results = from s in items select s;

    Console.WriteLine("Before add:");
    foreach (var result in results)
    {
        Console.WriteLine(result);
    }

    items.Add("Mallory");

    //
    //  Enumerating the results again will return the new item, even
    //  though we did not re-assign the Linq expression to it!
    //

    Console.WriteLine("\nAfter add:");
    foreach (var result in results)
    {
        Console.WriteLine(result);
    }
}

위의 코드는 다음을 반환합니다.

Before add:
Bob
Alice
Trent

After add:
Bob
Alice
Trent
Mallory


답변

이 단지보다 더 많은 것을 LINQSQL와 기능은 더 단지보다 SQL언어에 포함 된 파서.


답변

큰 O 표기법 . LINQ를 사용하면 수행중인 작업을 모르는 경우 O (n ^ 4) 알고리즘을 구현하지 않고도 매우 쉽게 작성할 수 있습니다.


답변

Lambda식이 식 트리와 익명 대리자 둘 다로 해석 될 수 있으므로 동일한 선언식 lambdaIEnumerable<T>확장 메서드와 IQueryable<T>확장 메서드 모두에 전달할 수 있다고 생각합니다 .


답변

나를 툭 방법 등 많은 LINQ 확장 방법을 실현하는 데 시간이 너무 오래 Single(), SingleOrDefault()등이 람다을 과부하가 있습니다.

넌 할 수있어 :

Single(x => x.id == id)

이것을 말할 필요가 없습니다-나쁜 튜토리얼로 인해 습관이 생겼습니다.

Where(x => x.id == id).Single()


답변

LINQ to SQL에서 나는 DataContext를 이해하지 못하는 사람들, 그것을 어떻게 사용할 수 있고 어떻게 사용해야 하는지를 끊임없이 봅니다. 너무 많은 사람들이 지속성 오브젝트가 아닌 작업 단위 오브젝트가 무엇인지 DataContext를 보지 못합니다.

사람들이 각 작업에 대해 새로운 시간을 만드는 대신 DataContext / 세션 / 세션 등을 싱글 톤하려고하는 많은 시간을 보았습니다.

그런 다음 IQueryable을 평가하기 전에 DataContext를 폐기하지만 사람들은 DataContext보다 IQueryable을 이해하지 못하는 경향이 있습니다.

내가 혼동하는 다른 개념은 Query Syntax vs Expression Syntax입니다. 그 시점에서 가장 쉬운 것을 사용하고 종종 Expression Syntax를 사용합니다. 많은 사람들이 여전히 똑같은 결과물을 만들어 낼 것이라는 것을 아직 모르고 있습니다. Query는 결국 Expression으로 컴파일됩니다.