2010-01-15 2 views
2

Мне нужна помощь с запросом LINQ в VB.Net, пожалуйста.Простой вопрос LINQ - как проходить через группу?

У меня есть это простое заявление группы:

Dim drivers = From d In DriversOwners _ 
    Group d By Key = d.UnitNumber Into Group _ 
    Select Key, DriverGroup = Group 

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

For Each x In drivers 

Next 

Однако компилятор лает на меня, говорил мне, что

«„х“не доступен в этом контексте, потому что это„Друг“.»

Кто-нибудь знает, что я делаю неправильно здесь?

Заранее спасибо.

+0

Я добавил еще один запрос Linq, который я скопировал на странице примеров MS, и он дает мне ошибку: Выражение типа «Объект» не запрашивается. Убедитесь, что у поставщика LINQ отсутствует ссылка на сборку и/или импорт пространства имен. Но я добавил все ссылки - System.Core, System.Data.Linq, System.Xml.Linq ... У меня также есть все операторы Imports в верхней части класса ... I» м, вытаскивая мои волосы здесь. – camainc

ответ

1

Я не уверен, если вы решили эту проблему или нет. Сегодня у меня была такая же проблема, и в результате я работал не с однобуквенной переменной в цикле For Each. Мой код был таким же, как ваша:

For Each x In a 
... 
Next 

Когда я изменил код на следующее он работал:

For Each retVal in a 
... 
Next 

Я также нашел такое же поведение ошибки «Друг» для любой переменной одной буквы.

Я понятия не имею, почему это так, но я думал, что пройду это, если этот вопрос все еще там.

+0

Спасибо, вот что я и сделал. Я буду отмечать ваш ответ как правильный, так как это единственный способ заставить этот код работать. – camainc

2

Похоже, что переменная x была объявлена ​​ранее - как поле класса, параметр метода или локальная переменная.

Я прав?

+0

Nope - я использовал «х» специально, потому что он больше нигде не используется. На самом деле, не имеет значения, какую однобуквенную переменную я использую вместо «x», я получаю ту же ошибку. Когда я пытаюсь заменить слово «x» словом, например «foo», я получаю другую ошибку: «Имя« foo »не объявлено.« – camainc

+0

Просто для любопытства вы можете изменить для каждой строки« Для каждого x As Object In drivers »и посмотреть, дает ли это сообщение об ошибке? Я воспроизвел простую версию вашего кода и использовал точный оператор LINQ, который вы предоставили, и не может заставить его поднять эту ошибку. –

+0

Ну, это работает, конечно, но я ничего не могу сделать с объектом, кроме тех пяти меток объекта по умолчанию. Кажется, мне может не хватать ссылку на сборку или что-то. Это проект .Net 2.0, который я изменил для целевого .Net 3.5. Я добавил все ссылки LINQ, но все же что-то кажется неправильным. – camainc

5

После копания и рытья я наконец нашел ответ на эту проблему. Поговорите о тупой!

Enabling LINQ in a .NET Framework 3.5 Project

When you move a project to .NET Framework 3.5, a reference to System.Core and a project-level import for System.Linq (in Visual Basic only) are added automatically. If you want to use LINQ features, you must also turn Option Infer on (in Visual Basic only) [my emphasis].

Когда я изменил целевую структуру от 2,0 до 3,5, Visual Studio автоматически добавляется узел System.Core и автоматически импортированы пространство имен System.Linq. Теперь почему в мире он также не установил опцию Infer на «On»?

http://msdn.microsoft.com/en-us/library/bb398197.aspx

+0

Поздравляем с решением вашей проблемы. В ответ на ваш вопрос см. примечание здесь http://msdn.microsoft.com/en-us/library/bb384665.aspx, в котором говорится: «Если вы не укажете« Вкл. »или« Выкл. », по умолчанию используется« Вкл. »для проектов, созданных в Visual Basic 2008. По умолчанию используется значение« Выкл. » r проектов, обновленных с более ранних версий. » –

+0

Ну, я думал, что решил проблему, но нет. Оригинальная проблема все еще существует. – camainc

+0

Спасибо, Ахмад, оцените это. – camainc

Смежные вопросы