2010-01-22 2 views
4

У меня есть запрос Linq следовать, что в веб-приложение, которое превращалось из .NET 1.1 до 3.5:Linq запрос не возвращает IEnumerable

dim objListOfFilteredDataRows = from datarows as datarow in objDataSet.tables(0).rows _ 
           where datarows("SomeColumn") = SomeValue 

У меня есть точно такой же запрос в приложении, которое было создано с использованием .NET 3.5, и запрос возвращает IEnumerable. Однако запрос в преобразованном приложении возвращается:

{Name = "WhereEnumerableIterator`1" FullName = "System.Linq.Enumerable+WhereEnumerableIterator`1[[System.Data.DataRow, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"} 

** Edit: Когда я выделите выражение, то IntelliSense говорит, что он не знает тип objListOfFilteredDataRows и предполагает его тип «Объект» ,

Почему тип не infered в преобразованном 1.1 приложения, но infered в «родной» 3,5? **

Что я здесь отсутствует? Как я конвертировать «WhereEnumeratorIterator`1 к IEnumerable? Спасибо!

+0

Вы получаете фактическую ошибку где-то из-за этого или просто путаетесь с отладчиком? Похоже, что все в порядке (поскольку, как было сказано ниже, 'WhereEnumerableIterator ' реализует 'IEnumerable '). Если вы получаете проблему преобразования типов, давайте посмотрим код, в котором происходит эта проблема. – bdukes

+2

Я нашел решение!Опция Infer в разделе «Компиляция» параметров проекта была отключена. Это связано с тем, что проект был преобразован из более ранней версии в версию 3.5 .NET. – Achilles

+0

Вы должны добавить это как ответ и принять свой ответ в качестве решения. –

ответ

3

Я нашел this Подробный разбор изменений настройки .NET проектов, которые должны быть обновлены при преобразовании проекта из более ранней версии .NET 3.5 для того, для проекта и компилятора для поддержки Linq и функции вывода типа, связанной с использованием Generics. В разделе «Настройки проекта» на вкладке «Скомпилировать» параметр «Выбор параметра» должен быть установлен на «Вкл.». Это позволит компилятору вывести тип «someobject», созданный любым «dim someobject = [some expression]». Поэтому, когда я использовал отладчик, я не видел ожидаемого IEnumerable или не мог использовать любой из этих интерфейсов ассоциированных членов и свойств. Поскольку проект, в котором находился запрос Linq, был оригинальным приложением 3.5, по умолчанию устанавливается опция «Выбор вывода».

+0

Блестящий! У меня была такая же проблема, и я установил ее примерно через минуту благодаря MSDN и StackOverflow. –

4

Тип WhereEnumeratorIterator1 является сгенерированный класс, который сам реализует IEnumerable(Of T). Это на самом деле результат компиляции C# итератор в System.Core.dll.

Никакого преобразования не требуется, потому что вы никогда не видите WhereEnumeratorIterator1 типа в вашем коде, как это частный для System.Core.dll. Вместо этого вы видите только тип возвращаемого запроса, который в этом случае будет IEnumerable(Of T).

1

вы может просто вызвать метод расширения AsEnumerable() в самом запросе, если вам нужен объект явно как IEnumerable<T> (в случае, если вам нужно, например, смешать LINQ-to-SQL и LINQ-to-Objects).

Для примера, это будет:

dim objListOfFilteredDataRows = (from datarows as datarow in objDataSet.tables(0).rows _ 
           where datarows("SomeColumn") = SomeValue).AsEnumerable() 

Если все, что вам нужно, это то, что реализует IEnumerable<T>, то сам запрос должен работать; вы испытываете проблему?

+0

Могу ли я получить образец кода, пожалуйста? – Achilles

+0

Спасибо за образец. Есть ли у вас комментарии о том, почему преобразованное приложение не выводит тип, который генерирует запрос? – Achilles

+0

Почему downvote? –

5

Нет, вы действительно получили IEnumerable. Это просто реализуется классом внутри пространства имен System.Linq.Enumerable, частного класса. Это неизбежно, нет способа создать экземпляр интерфейса. Не позволяйте информации отладчика поставить вас на неверный трек.

0

Пожалуйста, убедитесь, что у вас есть System.Linq пространство имен в этом файле

+0

Я импортировал пространство имен. Тип не выводится в преобразованном приложении 1.1. – Achilles

+0

Извините. Я был уверен, что ваша проблема сложнее – st78

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