Как получить правильное значение динамического типа? - PullRequest
4 голосов
/ 25 мая 2011

[обновление]

Извините, я должен отметить этот вопрос как MVC-2, я передаю результат запроса в модель представления, поэтому я должен указать тип моей модели в заголовке View Defintion. Я заявляю это так:

Inherits="System.Web.Mvc.ViewPage<IQueryable<dynamic>>"

как никогда ничего не изменилось и ничего ответы не работают для меня :(. наконец, я использовал класс ModelView как помощник, чтобы поместить в него мой запрос. (

[/ обновление]

У меня такой запрос:

IQueryable<dynamic> result = from d in KiaNetRepository.KiaNetEntities.Discounts
             where d.AgentTypeID == agentTypeId
             select new { d.Category,  d.DiscountValue, d.PriceConfige };

тогда я получаю значение на мой взгляд, как это:

foreach(var item in result){

    Category cat = item.Category; // throws exception 'object' does not contain a definition for 'Category' 

    //...

}

обратите внимание, что тип запроса как IQueryable - это класс анонимного ...

Ответы [ 4 ]

0 голосов
/ 27 мая 2011

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

Самое простое решение - вызвать ToList() в вашем запросе, а затем выбрать каждый анонимный тип и скопировать параметры в объявленный класс или expandoobject.

0 голосов
/ 25 мая 2011

Если по какой-либо конкретной причине результат не равен IQueryeable<dynamic>, я бы рекомендовал использовать var result = .... Это позволит компилятору создать result типа IQueryable<T> с T типом анонимного класса, который вы создаете, используя new { ... } в select Нет необходимости использовать dynamic из кода, который вы здесь показываете.

0 голосов
/ 27 мая 2011

Если вы замените несоответствующее объявление IQueryable<dynamic> на var, конечно, оно работает, я только что проверил его.

0 голосов
/ 25 мая 2011

Попробуйте объявить имена явно:

select new { Category = d.Category,  DiscountValue = d.DiscountValue, PriceConfige = d.PriceConfige }
...