2009-02-09 3 views
17

이 VB Linq 쿼리의 다음 두 버전의 결과 차이점은 무엇입니까?VB Linq에서 "New ... With"구문은 무엇을합니까?

은 '우리가 다른 곳

Dim ee = From e In someXML.<Employee> _ 
Select New With {.Surname = e.<Surname>, .Forename = e.<Forename>} 

Dim ee = From e In someXML.<Employee> _ 
Select Surname = .Surname = e.<Surname>, .Forename = e.<Forename> 

정의 직원의 세부 사항을 포함하는 XElement를가 있다고 가정 즉 새로운 점 ... 구문은 무엇인가?

나는 이것에 대한 간단한 답을 갖고 있지만 의심 스럽지만 찾을 수 없다. 적합한 튜토리얼 또는 Microsoft 문서에 대한 링크는 인정 될 것이다.

답변

14

차이점은 첫째는 익명 형식을 명시 적으로 만듭니다. 두 번째는 쿼리 식이며 익명 형식을 만드는 대신 기존 형식을 사용할 수 있습니다. Cameron MacFlland가 링크 한 문서에서 :

쿼리 식에서 항상 익명 형식을 만들 필요는 없습니다. 가능한 경우 기존 유형을 사용하여 열 데이터를 보유합니다. 이 쿼리는 데이터 소스의 전체 레코드 또는 각 레코드의 하나의 필드 만 반환하는 경우에 발생합니다.

+0

_single_ 열을 선택할 때 익명 형식이 없다는 것을 의미하지 않습니까? 따라서 위의 예에서는 2 개의 열이 사용되는 경우에는 적용 할 수 없습니다. –

+0

예, 해당 예제에는 차이가 없습니다. 그러나 _general_의 경우에는 _potential_ 차이입니다. 또한 전체 레코드를 다시 가져 오는 경우 기존 유형을 사용할 수 있으므로 단일 열만있는 것이 아닙니다. –

+0

두 코드 코드 모두 항상 익명 형식을 사용합니다. – JaredPar

1

그들은 Anonymous Types입니다.

주로 사용하는 이유는 쿼리의 데이터를 단일 개체로 유지하는 것이므로 반복기는 개체 목록을 반복하여 계속 처리 할 수 ​​있습니다.

큰 또는 여러 부분 LINQ 쿼리의 중간에 저장소의 임시 형식으로 작동하는 경향이 있습니다.

+0

예 - 나는 그들이 무엇인지 알지만이 두 형식의 구문의 차이점은 무엇입니까? 제공하신 링크는 두 양식의 예를 보여 주지만 해당 양식이 동일한 지 여부는 밝히지 않았습니다. –

+0

물론 그럴 수 있습니다 : 나는 당신을 위해 그 링크에서 정확히 어디에 있는지 지적했습니다. –

+0

ok - 카메론과 조엘의 설명을 결합하는 것이 이제는 의미가 있습니다. 대단히 감사합니다. –

2

차이점이 없습니다.

New With은 특히 LINQ 쿼리를 들어, New With를 건너 뛸 수 있습니다

Dim X = New With { .Surname = "A", .Forename = "B" } 

같은 밖으로의 쿼리를 사용하는 것을 목표로,하지만 여전히 다른 상황에 유용합니다. 그러나 나는 VB 9를 모르기 때문에 확신하지 못합니다.

+0

쿼리에 따라 부분 클래스에 추가 한 사용자 정의 속성을 추가했거나 명시 적 익명 형식으로 반환되지 않으면 다른 필드는 {+}로 새 선택을 사용하여 읽기 전용으로됩니다. – Nathan

0

한 가지 차이점은 익명 유형은 직렬화 할 수 없다는 것입니다.

2

나열된 두 코드간에 기능상의 차이점은 없습니다. 두 코드 모두에서 코드는 익명 형식을 사용하여 쿼리의 데이터를 반환합니다.

첫 번째 코드는 익명 형식을 명시 적으로 사용하도록 만듭니다. 이 구문이 허용되는 이유는 Select 절에서 모든 유형을 반환 할 수 있기 때문입니다. 그러나 형식은 명시 적으로 사용해야합니다.

Dim x = From it in SomeCollection Select New Student With { .Name = it.Name } 

요엘은 두 번째 쿼리가 기존 유형을 사용할 수 있다는 그의 말에 잘못되었습니다. 명시 적 형식이 없으면 명시 적 속성 이름을 사용하는 select 절은 항상 익명 형식을 반환합니다.

1

차이는 없습니다. 컴파일러는 익명 형식을 유추합니다.

XElement 대신 String을 반환하는 e.<Surname>.Value의 요소 값을 반환 할 가능성이 가장 높습니다. 컴파일러는 또한 익명 형식의 멤버의 이름을 추론하기 때문에

귀하의 두번째 예는

Dim ee = From e In someXML.<Employee> _ 
     Select e.<Surname>.Value, e.<Forename>.Value 

로 단순화 할 수있다. 당신이 다음 클래스가있는 경우

그러나

Class Employee 

    Private _surname As String 
    Public Property Surname() As String 
     Get 
      Return _surname 
     End Get 
     Set(ByVal value As String) 
      _surname = value 
     End Set 
    End Property 

    Private _forename As String 
    Public Property Forename() As String 
     Get 
      Return _forename 
     End Get 
     Set(ByVal value As String) 
      _forename = value 
     End Set 
    End Property 

End Class 

그런 다음 당신은 너무 등으로 ... 새로운를 사용하여 대신 익명 형식의 IQueryable(Of Employee)을 생산하기 위해 1 쿼리를 변경할 수 있습니다 :

Dim ee = From e In someXML.<Employee> _ 
     Select New Employee With {.Surname = e.<Surname>.Value, _ 
            .Forename = e.<Forename>.Value}