"LINQ to Entities", "LINQ to SQL"및 "LINQ to Dataset"의 차이점은 무엇입니까?


91

나는 LINQ로 꽤 오랫동안 일해 왔습니다. 그러나 언급 된 LINQ 버전 간의 실제 차이점이 무엇인지는 미스터리로 남아 있습니다.

성공적인 답변에는 그들 사이의 짧은 차이가 포함됩니다. 각 버전의 주요 목표는 무엇이며 이점은 무엇이며 성능에 영향이 있습니까?

추신 : 많은 정보 출처가 있다는 것을 알고 있지만, 초보자에게 특정 목표를 향해 어디로 향해야하는지 알려주는 일종의 "치트 시트"를 찾고 있습니다.


답변:


110
  • 모두 LINQ (언어 통합 쿼리)이므로 모두 많은 공통성을 공유합니다. 이러한 모든 "방언"을 통해 기본적으로 다양한 소스에서 쿼리 스타일의 데이터를 선택할 수 있습니다.

  • Linq-to-SQL 은 ORM (Object-Relational Mapper)에 대한 Microsoft의 첫 번째 시도입니다. SQL Server 만 지원합니다. SQL Server 데이터베이스 테이블을 .NET 개체에 매핑하는 매핑 기술입니다.

  • Linq-to-Entities 는 동일한 아이디어이지만 백그라운드에서 Entity Framework를 ORM으로 사용합니다-다시 Microsoft에서 제공하지만 여러 데이터베이스 백엔드를 지원합니다.

  • Linq-to-DataSets 는 LINQ이지만 사용은 "구식"ADO.NET 2.0 DataSet에 대한 것입니다. -to-DataSets는 데이터 저장소에 데이터를 쿼리합니다. 따라서이 경우 데이터베이스 백엔드에서 DataTable 또는 DataSet (System.Data 네임 스페이스)을 반환 한 다음 LINQ 구문을 사용하여 쿼리합니다.


1
50k를 축하합니다. 이제 공식적으로 StackOverflow에 너무 많은 시간을 보냈습니다. ;)
Aaronaught

1
@Aaronaught : 감사합니다-그리고 당신은 절대적으로 옳습니다! :-) 모든 사람에게 하나의 중독을 남겨야합니다 . 부디?!?!?!
marc_s

1
marc_s,이 답변에 감사드립니다. 성능에 대해 말해 줄 수 있습니까? 귀하의 답변에서 Linq-to-Entities가 가장 진보되어 아마도 가장 성능이 좋다고 생각합니까?
마르셀

2
@Marcel : 내 직감 (정확한 사실 없음)에서, Linq-to-SQL 또는 가장 빠르다 (데이터베이스와 개체 모델 사이에 단 하나의 계층), Linq-to-Dataset, 그리고 Linq-to -Entity Framework는 항상 두 개의 매핑 계층 (따라서 가장 복잡함)을 갖기 때문에 마지막 항목입니다. 그러나 다시 : 그냥 직감은 어떤 숫자는 백업 없습니다
marc_s

3
@marc_s 이것이 오래된 게시물이라는 것을 알고 있지만 LINQ to Entities는 대부분의 경우 LINQ to Dataset보다 빠를 것입니다. LINQ to Dataset은 실제로 유형이 아니라 데이터 집합을 개체로 사용하는 개체에 대한 LINQ입니다. 개체에 대한 LINQ는 SQL을 수행하지 않으므로 먼저 SQL 원본에서 데이터 집합을 만들어야하며 개체에 대한 LINQ는 데이터 집합으로 데이터를 검색 할 때 쿼리 최적화를 수행하는 데 도움이되지 않습니다. 모든 열이 박스형이고 모든 유형 이동으로 인해 성능이 저하되기 때문에 그와 데이터 세트는 성능면에서 끔찍합니다.
로버트 맥키

38

LINQ는 다음과 같은 쿼리 이해 구문을 기반으로하는 광범위한 기술 집합입니다.

var qry = from x in source.Foo
          where x.SomeProp == "abc"
          select x.Bar;

컴파일러에 의해 코드로 매핑됩니다.

var qry = source.Foo.Where(x => x.SomeProp == "abc").Select(x => x.Bar);

그리고 여기서 진정한 마술이 시작됩니다. Foo여기에 무엇이 있는지 말하지 않았 으며 컴파일러는 신경 쓰지 않습니다! 오래 해결할 수있는 것처럼 일부 라는 적절한 방법 Where즉 람다를 취할 수 있으며, 그 결과를 가지고 어떤 Select 람다를 받아 들일 수 방법을, 그것은 행복하다.

지금 람다 컴파일 될 수 있다는 것을 고려 하거나 , (행 데이터 세트 LINQ-포함 LINQ 투 개체위한 위임) 익명의 방법으로 또는 객체 모델 람다를 나타내는 식 - 트리 (실행 모델 ).

메모리 내 데이터 (일반적으로 IEnumerable<T>)의 경우 델리게이트를 훌륭하고 빠르게 실행합니다. 그러나 IQueryable<T>식 (a LambdaExpression<...>) 의 개체 표현의 경우 이를 분리하여 "LINQ-to-Something"예제에 적용 할 수 있습니다.

데이터베이스 (LINQ-to-SQL, LINQ-to-Entities)의 경우 TSQL 작성을 의미 할 수 있습니다. 예를 들면 다음과 같습니다.

SELECT x.Bar
FROM [SomeTable] x
WHERE x.SomeProp = @p1

하지만 (예를 들어 ADO.NET 데이터 서비스의 경우) HTTP 쿼리 작성을 의미 할 수 있습니다.

적은 양의 데이터를 반환하는 잘 작성된 TSQL 쿼리를 실행하는 것이 네트워크를 통해 전체 데이터베이스를로드 한 다음 클라이언트에서 필터링하는 것보다 빠릅니다. 하지만 둘 다 이상적인 시나리오와 아주 잘못된 시나리오를 가지고 있습니다.

여기서의 목표와 이점은 단일 정적 검사 구문을 사용하여 광범위한 데이터 소스를 쿼리하고 코드를보다 표현 적으로 만들 수 있도록하는 것입니다 (예를 들어 데이터를 그룹화하는 "전통적인"코드는 그렇지 않습니다. 무엇을하려고하는지에 대해 매우 명확합니다. 코드의 양에서 손실됩니다).


마크,이 통찰력에 감사드립니다. 그러나 나는 그러한 상세한 내부에 대해 묻지 않았습니다. -1, 미안합니다. 질문에 대한 답이 없기 때문입니다.
마르셀

7
자신의 LINQ 공급자를 작성하는 사람으로서 지금까지 본 최고의 답변입니다. 나는 -1에 대해 동의하지 않는다.
Dan Barowy 2013 년

30

LINQ는 언어 통합 쿼리를 의미합니다. 이를 통해 C # 내에서 직접 "SQL 스타일"쿼리 언어를 사용하여 데이터 소스에서 정보를 추출 할 수 있습니다.

  • 해당 데이터 소스는 SQL 서버 데이터베이스 일 수 있습니다. 이것은 Linq to SQL입니다.
  • 해당 데이터 소스는 엔티티 프레임 워크 객체의 데이터 컨텍스트가 될 수 있습니다 . Linq에서 엔티티로 .
  • 해당 데이터 소스는 ADO.net 데이터 세트 ( Linq to Dataset) 가 될 수 있습니다 .

이 데이터 소스는 또한 XML 파일 ( Linq to XML)이 될 수 있습니다 .
또는 일반 객체의 Collection 클래스 인 Linq to Objects .

LINQ는 쿼리 기술을 설명하고 나머지 이름은 쿼리되는 데이터의 소스를 설명합니다.

약간의 추가 배경 :

데이터 세트 는 데이터가 데이터베이스에서 .net 데이터 세트로로드되는 ADO.net 개체이며 Linq는로드 된 후 해당 데이터를 쿼리하는 데 사용할 수 있습니다.

함께 SQL에 Linq에 당신은 데이터베이스와 Linq에 - 투 - SQL에 대한지도는 SQL 서버 데이터베이스에서 데이터를로드을 담당하는 것이 .NET 클래스를 정의

마지막으로 Entity 프레임 워크 는 XML로 데이터베이스 및 개체 매핑을 정의한 다음 Linq를 사용하여이 매핑을 통해로드되는 데이터를 쿼리 할 수있는 시스템입니다.


3
실제로 Linq-to-SQL은 SQL 데이터베이스 백엔드가 아니라 SQL Server 전용입니다.
marc_s

3
@marc_s : 좋은 자리. 감사. 관심이 있다면 다른 데이터베이스에 대한 타사 Linq 대 SQL 공급자가 있습니다. code2code.net/DB_Linq 또는 Google을 참조하십시오 . 그래도 품질에 대해서는 언급 할 수 없습니다.
Simon P Stevens

1
Simon, 특히 Entitiy 프레임 워크의 유용한 2 줄 요약에 감사드립니다. +1
Marcel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.