2013-09-04 6 views
0

В первой, у меня есть переменная в моем контроллере в результате запроса магазин Linq, как показано ниже:MVC LinQ IQueryable Anonymous обработка Тип

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(); 
        } 

Вышеприведенные работает отлично, и я в состоянии генерировать DropDownList и 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 это теперь жалуется, что выражение дерево не может содержать динамическую операцию

ответ

0

здесь динамический тип только внутри рамки 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{ .................}; 
    } 
}  

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

Can't return anonymous type from method? Really?

+0

Есть ли другой способ лучше, чем создавать новый класс? Я могу отказаться от использования «динамического», если есть обходное решение, отличное от создания нового класса. –

+0

. Мой плохой для того, чтобы четко не указать язык, который использовался. На самом деле это MVC, и, следовательно, не существует никакого метода CAST, как показано в общей ссылке. Спасибо за вашу помощь. –

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