Что делает синтаксис "New ... With" в VB Linq? - PullRequest
18 голосов
/ 09 февраля 2009

В чем (если есть) разница между результатами следующих двух версий этого запроса 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 будут оценены.

Ответы [ 6 ]

15 голосов
/ 09 февраля 2009

Разница в том, что 1-й явно создает анонимный тип. Второе является выражением запроса и может использовать существующий тип вместо создания анонимного типа. Из документации, на которую ссылается Кэмерон МакФарланд:

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

2 голосов
/ 09 февраля 2009

Функциональных различий между двумя перечисленными вами фрагментами кода нет. В коде обеих частей будет использоваться анонимный тип для возврата данных из запроса.

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

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

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

2 голосов
/ 09 февраля 2009

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

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

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

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

1 голос
/ 15 мая 2009

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

Скорее всего, вы хотите вернуть значение элементов, как в 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

Тогда вы могли бы изменить 1-й запрос для получения IQueryable(Of Employee) вместо анонимного типа, используя New ... С таким образом:

Dim ee = From e In someXML.<Employee> _
         Select New Employee With {.Surname = e.<Surname>.Value, _
                                   .Forename = e.<Forename>.Value}
1 голос
/ 09 февраля 2009

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

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

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

0 голосов
/ 09 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...