나는 LINQ로 꽤 오랫동안 일해 왔습니다. 그러나 언급 된 LINQ 버전 간의 실제 차이점이 무엇인지는 미스터리로 남아 있습니다.
성공적인 답변에는 그들 사이의 짧은 차이가 포함됩니다. 각 버전의 주요 목표는 무엇이며 이점은 무엇이며 성능에 영향이 있습니까?
추신 : 많은 정보 출처가 있다는 것을 알고 있지만, 초보자에게 특정 목표를 향해 어디로 향해야하는지 알려주는 일종의 “치트 시트”를 찾고 있습니다.
답변
-
모두 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 구문을 사용하여 쿼리합니다.
답변
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 쿼리를 실행하는 것이 네트워크를 통해 전체 데이터베이스를로드 한 다음 클라이언트에서 필터링하는 것보다 빠릅니다. 하지만 둘 다 이상적인 시나리오와 아주 잘못된 시나리오를 가지고 있습니다.
여기서의 목표와 이점은 단일 정적 검사 구문을 사용하여 광범위한 데이터 소스를 쿼리하고 코드를보다 표현 적으로 만들 수 있도록하는 것입니다 (예를 들어 데이터를 그룹화하는 “전통적인”코드는 그렇지 않습니다. 무엇을하려고하는지에 대해 매우 명확합니다. 코드의 양에서 손실됩니다).
답변
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를 사용하여이 매핑을 통해로드되는 데이터를 쿼리 할 수있는 시스템입니다.