2014-11-23 5 views
1

LINQ를 처음 사용했습니다. 아래 코드를 참조하십시오.LINQ - 특정 열 선택

Public Class Person 
    Public Name As String 
    Public Address As String 
    Public Age As String 
End Class 

Public Class Form1 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 
     Try 
      Dim p1 As New Person 
      Dim p2 As New Person 
      Dim p3 As New Person 

      p1.Name = "Ian" 
      p1.Age = 32 
      p1.Address = "8 street" 

      p2.Name = "Fred" 
      p2.Age = 62 
      p2.Address = "5 road" 

      p3.Name = "Bernie" 
      p3.Age = 59 
      p3.Address = "5 road" 

      Dim list As New List(Of Person) 
      list.Add(p1) 
      list.Add(p2) 
      list.Add(p3) 

      Dim test As IEnumerable(Of Person) = From p In list 
         Where p.Name = "Ian" 
         Select p.Name, p.Age 
     Catch ex As Exception 
      MsgBox(ex.ToString) 
     End Try 

    End Sub 
End Class 

테스트를 어떻게 진행합니까?

은 내가 이런 식으로 뭔가를 할 수 알고 :

Dim test As IEnumerable(Of Person) = From p In list 
         Where p.Name = "Ian" 
         Select p 
      Dim List2 As List(Of Person) = test.ToList 

그러나,이를 바탕으로 만 전체 개체를 선택할 수있는 SELECT 절의 요점 것입니다.

답변

2

결과에 더 이상 Address이 포함되어 있지 않으면 더 이상 Person이 아닙니다.

다음 수행 일 :

Dim test = From p In list 
      Where p.Name = "Ian" 
      Select New With { .Name = p.Name, .Age = p.Age } 

이는 관심있는 정보를 포함하는 새로운 익명 형식을 생성 test의 유형은 IEnumerable(Of SomeAnonymousTypeThatDoesNotHaveAName)입니다.. 일반적으로


Select 조항의 목적은 프로젝션을하는 것입니다. 예를 들어, 문자열에 사람을 프로젝트 수 :

Dim namesWithAges As IEnumerable(Of String) = 
    From p In list Select p.Name & " (" & p.Age & ")" 

또는 일부 완전히 새로운 개체에을 : 당신은 확실히 그들이에서 생성하고 함수 밖에서는 익명 형식으로 작업 할 수

Dim employees = 
    From p In list 
    Select New With { .Name = p.Name, .Supervisor = DetermineSupervisor(p) } 
+0

감사합니다. 이런 식의 익명 형식을 사용하는 것은 나쁜 습관입니까? +1. – w0051977

+0

아니, 괜찮습니다. 익명 형식을 반환하거나 서브 루틴으로 전달할 수 없으므로 현재 메서드에서만 유용합니다. 리턴 타입은 익명 일 필요는 없습니다 :'Select New SomeClassOfMine (p.Name, p.Age)'는 완벽하게 괜찮습니다. – Heinzi

+0

데이터 액세스 계층에서 사람 목록을 반환 한 다음 필요에 따라 비즈니스 계층에서 이상 유형을 사용할 수 있다고 생각하십니까? – w0051977

1

.

다음은 예입니다.

대신 Dim test As IEnumerable(Of Person)의 서명 쿼리를 정의

이처럼 수행

Dim test = _ 
    From p In list 
    Where p.Name = "Ian" 
    Select p.Name, p.Age 

컴파일러는 익명 형식을 추론합니다.

이제 다음이 같은 기능에 사용할 수 있습니다

Public Function GetDisplayItems(Of T)(items As IEnumerable(Of T), toString As Func(Of T, String)) As String 
    Return String.Join(Environment.NewLine, items.Select(toString)) 
End Function 

이 기능은 컴파일러가 그렇게 추론 할 수 익명 유형을 호출 할 수있는 일반적인 유형이 있습니다. 이 시도 : 내가 얻을

Dim text = GetDisplayItems(test, Function (t) t.Name & " " & t.Age) 

Console.WriteLine(text) 

결과는 텍스트 Ian 32입니다. 분명히 이것은 간단한 예이지만 실제로이 접근법으로 많은 것을 할 수 있습니다.