Итерировать через IQueryable без определенного типа?

Итак, у меня есть этот запрос LINQ, который заканчивается настраиваемым выбором вроде этого:

select new { this1 = table.this1, this2 = othertable.this2 }

Вызов этого запроса из Контроллера выглядит примерно так:

ViewData["these"] = theRepo.GetAllThese(someVar, anotherVar);

Теперь, когда я передаю это своему представлению, поскольку оно не строго типизировано, как я могу перебирать его с помощью foreach, как я могу преобразовать его как IQueryable или List, если я не знаю, что в нем?

... это что-то вроде этого?

IQueryable<???> these = ViewData["These"];
foreach (var this in these) {...

Просто нужно знать, что поставить для "???" Думаю.


person Ryan    schedule 02.12.2009    source источник
comment
var никогда не может быть возвращаемым типом :)   -  person Webleeuw    schedule 02.12.2009
comment
Какой тип возврата GetAllThese()?   -  person Yannick Motton    schedule 02.12.2009
comment
@Webleeuw, это отлично работает: public string GetFoo() { var x = "foo"; return x; }   -  person Jørn Schou-Rode    schedule 02.12.2009


Ответы (2)


Ваш запрос linq возвращает коллекцию анонимно типизированных объектов. Поскольку они анонимны, невозможно «назвать их имя» при объявлении явно типизированной переменной. Таким образом, истинный тип / форма объектов известен только в рамках метода действия, в котором эти объекты определены.

Индексированный получатель объекта ViewData имеет тип возвращаемого значения object, и, не зная имени типа, вы хотите иметь возможность преобразовать возвращаемое значение ViewData["these"] во что-нибудь полезное.

Вместо этого вы можете создать модель, а именно " view model " - который определяет структуру объектов, которые вы выбираете с помощью LINQ:

public class FoobarViewModel
{
    public string Foo { get; set; }
    public string Bar { get; set; }
}

и переопределите свой запрос, чтобы сделать выбор следующим образом:

select new FoobarViewModel { foo = table.this1, bar = othertable.this2 }

Теперь ваши объекты имеют общий именованный класс, и ваша коллекция может быть легко преобразована в правильный тип в представлении.

person Jørn Schou-Rode    schedule 02.12.2009

Вы не можете использовать анонимный тип (выберите новое {Свойство = значение}) вне области, в которой он определен. Поэтому вам следует использовать foreach (var x in {yourQueryHere}) из метода, в котором вы определили запрос.

Пример: это возможно:

    public void myMethod() {
        var x = from c in IEnumerable select new { Prop = value };
        foreach (var y in x) {
        }
    }

Это невозможно:

    public void myMethod() {
        foreach (var y in myMethod2()) {
        }
    }

    public IQueryable<???> myMethod2() {
        return from c in IEnumerable select new { Prop = value };
    }
person Webleeuw    schedule 02.12.2009