Тип IQueryable в массив

У меня есть такой динамический запрос Linq. Мне нужно преобразовать набор результатов в массив. Но я не могу преобразовать тип IQueryable в массив. Любое предложение?

мой код: -

var query = Data.AsEnumerable()
                .AsQueryable()
                .Select("new(it[\"Country\"] as Country)", "it")
                .Take(10);

foreach (string str in query) // **getting error Unable to cast object of type 'DynamicClass1' to type 'System.String**
{

}

Я исправил это следующим образом: - foreach (var str in query).

Но теперь у меня другая проблема. Я добавил условие where к запросу. Теперь я получаю сообщение об ошибке «В типе DataRow нет свойства или поля« Страна »». вот мой запрос

 var query= Data.AsEnumerable().AsQueryable().Where("Country = @0", "London").Select("new (Country as Country)");

person Dev    schedule 29.01.2014    source источник
comment
Что должен вернуть запрос? Объясните, для чего нужен string str.   -  person Gabe    schedule 29.01.2014
comment
AsEnumerable().AsQueryable(), кажется, такая плохая идея ...   -  person MarcinJuraszek    schedule 29.01.2014
comment
Спасибо за ответ, я исправил его вот так: - foreach (var str in query). Но теперь у меня другая проблема. Я добавил условие where к запросу. Теперь я получаю сообщение об ошибке. В типе DataRow нет свойства или поля «Страна». Ниже приведен мой запрос var query = Data.AsEnumerable (). AsQueryable (). Where (Country = @ 0, London) .Select (new (Country as Country));   -  person Dev    schedule 29.01.2014
comment
Пожалуйста, обновите свой вопрос последней версией кода, который вы пробовали, и укажите, в чем проблема.   -  person har07    schedule 29.01.2014


Ответы (1)


Когда вы используете Dynamic LINQ, все расширения возвращают коллекцию с dynamic элементами, поэтому вам нужно изменить свой код, например, следующим образом

foreach (dynamic str in query) 
{
    ....
}

также для вашего случая str - это объект с полем Country

ОБНОВЛЕНИЕ
для вопроса из комментария
если данные DataTable, когда вы вызываете AsEnumerable или AsQueryable, вы работаете с набором DataRow, поэтому, если вы хотите отфильтровать его по значению столбца, вам нужно использовать синтаксис для DataRow нравится

Data.AsQueryable().Where("it[\"Country\"] = @0", "London")

или вы можете сначала выбрать вот так

var query= Data.AsQueryable()
               .Select("new (it[\"Country\"] as Country)")
               .Where("Country = @0", "London")

UPDATE2
, пока вы не укажете тип поля, это может быть Object, поэтому вам нужно изменить предложение Select, подобное этому

....
.Select("new(Convert.ToString(it[\"Country\"]) as Country)")
....

в этом случае, когда вы вызываете Where после Select, поле Country будет String, поэтому String имеет Contains метод

person Grundy    schedule 29.01.2014
comment
Еще одно сомнение. Я изменил запрос на var data = Data.AsEnumerable (). AsQueryable (). Select (new (it [\ Country \] as Country)). Where (Country.Contains (@ 0), L); . Теперь я получаю сообщение об ошибке. В типе «Объект» не существует применимого метода «Содержит». Любая помощь? - person Dev; 29.01.2014
comment
Я видел, как это должно работать stackoverflow.com/questions/2455659/. Это потому, что мои данные также содержат нулевые записи? - person Dev; 29.01.2014
comment
благодаря. это помогло. это было основным, я должен был попробовать, прежде чем публиковать проблему. Спасибо, в любом случае :) - person Dev; 29.01.2014