Подтвердить что ты не робот

Что делает синтаксис "Новый... С" в VB Linq?

Что (если есть) - это разница между результатами следующих двух версий этого запроса VB Linq?

'предположим, что у нас есть XElement, содержащий данные о сотрудниках, определенные где-то еще

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>

то есть, что такое точка нового... С синтаксисом?

Я подозреваю, что у этого есть простой ответ, но я не могу его найти - любые ссылки на подходящие учебники или документацию Microsoft будут оценены.

4b9b3361

Ответ 1

Отличие состоит в том, что первый явно создает анонимный тип. Второй - выражение запроса и может использовать существующий тип, а не создавать анонимный тип. Из документации, связанной с Cameron MacFarland:

Выражения запросов не всегда требуют создания анонимных типов. Когда это возможно, они используют существующий тип для хранения данных столбца. Это происходит, когда запрос возвращает либо целые записи из источника данных, либо только одно поле из каждой записи.

Ответ 2

Я понимаю, что нет никакой разницы.

New With предназначен для использования вне запроса, например

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

В частности, для запросов Linq вы можете пропустить New With, но он по-прежнему полезен для других ситуаций. Я не уверен, однако, поскольку я не знаю VB 9:)

Ответ 3

Существует нет функциональной разницы между двумя фрагментами кода, которые вы указали. Под капотом оба куска кода будут использовать анонимный тип для возврата данных из запроса.

Первая часть кода просто делает явным использование анонимного типа. Причина, по которой этот синтаксис разрешен, заключается в возможности вернуть любой тип из предложения Select. Но тип должен использоваться явно.

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

Joel неверно в своем утверждении, что второй запрос может использовать существующий тип. Без явного типа предложение select, которое использует явное имя свойства, всегда будет возвращать анонимный тип.

Ответ 4

Они называются Анонимные типы.

Основной причиной их использования является сохранение данных из запроса в одном объекте, поэтому итераторы могут продолжать выполнять итерацию по списку объектов.

Они, как правило, работают как временные типы для хранения в середине большого или многочастного запроса LINQ.

Ответ 5

Нет никакой разницы. Компилятор выведет анонимный тип.

Вы, скорее всего, захотите вернуть значение элементов, как в e.<Surname>.Value, которое возвращает строку вместо XElement.

Ваш второй пример может быть упрощен как

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) вместо анонимного типа с помощью New... С таким же образом:

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

Ответ 6

Одно отличие состоит в том, что анонимные типы не могут быть сериализованы.