Невозможно выполнить итерацию коллекции анонимных типов, созданных из запроса LINQ в VB.NET - PullRequest
4 голосов
/ 17 марта 2010

Ладно, я должен что-то здесь упустить.

Каждый пример LINQ, который я видел для анонимных типов VB.NET, утверждает, что я могу сделать что-то вроде этого:

Dim Info As EnumerableRowCollection = pDataSet.Tables(0).AsEnumerable
Dim Infos = From a In Info _
            Select New With {
                             .Prop1 = a("Prop1"), 
                             .Prop2 = a("Prop2"), 
                             .Prop3 = a("Prop3") }

Теперь, когда я перебираю коллекцию (см. Пример ниже), я получаю ошибку, в которой говорится, что «Имя» x не объявлено.

For Each x in Infos
 ...
Next 

Как будто VB.NET не понимает, что Infos - это коллекция анонимных типов, созданных LINQ, и хочет, чтобы я объявил "x" как некоторый тип. (Не противоречит ли это цели анонимного типа?) Я добавил ссылки на System.Data.Linq и System.Data.DataSetExtensions в мой проект. Вот что я импортирую с классом:

Imports System.Linq
Imports System.Linq.Enumerable
Imports System.Linq.Queryable
Imports System.Data.Linq

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 18 марта 2010

Вам необходимо добавить Option Infer On перед Imports заявлениями. Вам также может понадобиться Option Strict Off в зависимости от того, используете ли вы его или нет. Это позволяет VB.NET выводить анонимный тип.

1 голос
/ 12 апреля 2011

Я обновлял с 20005 до 2008 по сравнению с 2010 г. Опция Infer Off была отключена, когда я ее включил, все работало просто отлично.

Я по умолчанию включен в версии 2010 и 2008, но в версии 2005 это не вариант !! S

1 голос
/ 18 марта 2010

Полностью не помогло, но это работает для меня в 2008 и 2010 годах, может быть, вам нужен OptionInfer?

 _people.Add(New Person With {.Name = "P1", .Age = 1, .BDay = Now})
        _people.Add(New Person With {.Name = "P2", .Age = 2, .BDay = Now})
        _people.Add(New Person With {.Name = "P3", .Age = 3, .BDay = Now})
        _people.Add(New Person With {.Name = "P4", .Age = 4, .BDay = Now})
        Dim infos = From x In _people _
                    Select New With {.anonName = x.Name, .anonAge = x.Age}

        For Each anon In infos
            Debug.Print("anonName=" + anon.anonName + " anonAge=" + anon.anonAge.ToString)
        Next
...