MVC LinQ IQueryable Обработка анонимных типов

Сначала у меня есть переменная в моем контроллере для хранения результатов запроса linq, как показано ниже:

var test= from m in db.testTable
          join n in db.testTable2
          on m.ID equals n.ID into tabA
          from a in tabA
          join o in db.testTable3
          on m.UserID equals o.ID
          select new { .................};
if (test.Count() > 0)
{
    foreach (var k in test)
    {
        ViewData["dropDown_xxx"] = test.Select(j => new { Value = j.ID, Text = j.Description})
                                   .AsEnumerable()
                                   .Select(j => new SelectListItem // Work with in-memory objects using LINQ to Objects instead of LINQ to Entities
                            {
                                Value = j.Value.ToString(),
                                Text = j.Text
                            }).ToList();
                    }  

Приведенное выше работает отлично, и я могу сгенерировать раскрывающийся список и ViewData.
Теперь я пытаюсь переместить этот запрос linQ в другой класс вместо того, чтобы вставлять этот контроллер, как показано ниже:

public class testClass{
    public IQueryable<dynamic> TestMethod(){
        return from m in db.testTable
        join n in db.testTable2
        on m.ID equals n.ID into tabA
        from a in tabA
        join o in db.testTable3
        on m.UserID equals o.ID
        select new { .................};
    }
}     

И теперь вызов его в моем предыдущем контроллере:

       var test= new testClass().TestMethod();
if (test.Count() > 0)
{
    foreach (var k in test)
    {
        ViewData["dropDown_xxx"] = test.Select(j => new { Value = **j.ID**, Text = **j.Description**})
                                   .AsEnumerable()
                                   .Select(j => new SelectListItem // Work with in-memory objects using LINQ to Objects instead of LINQ to Entities
                            {
                                Value = j.Value.ToString(),
                                Text = j.Text
                            }).ToList();
                    }  

Могу я узнать, что не так с кодом? В J.ID и J.Description теперь жалуется, что дерево выражений может не содержать динамическую операцию


person SuicideSheep    schedule 04.09.2013    source источник


Ответы (1)


здесь ваш динамический тип только внутри области действия TestMethod. Вам лучше создать новый класс и вернуть этот класс вызывающей стороне.

public class testClass{
    public IQueryable<MyClass> TestMethod(){
        return from m in db.testTable
        join n in db.testTable2
        on m.ID equals n.ID into tabA
        from a in tabA
        join o in db.testTable3
        on m.UserID equals o.ID
        select new MyClass{ .................};
    }
}    

Если вам нужно вернуть анонимный тип, проверьте это

Не удается вернуть анонимный тип из метода? Правда?

person Damith    schedule 04.09.2013
comment
Есть ли другой лучший способ, чем создание нового класса? Я могу отказаться от использования динамики, если есть обходной путь, кроме создания нового класса. - person SuicideSheep; 04.09.2013
comment
Моя ошибка за то, что я не указал четко язык, который использовался. На самом деле это MVC, и, следовательно, нет доступного метода CAST, как показано в ссылке, которой вы поделились. Спасибо за вашу помощь. - person SuicideSheep; 04.09.2013