通过IQueryable迭代没有特定类型?

时间:2009-12-02 12:49:12

标签: c# anonymous-types

所以我有这个LINQ查询结束于这样的自定义选择:

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

从Controller调用该查询看起来像这样:

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

现在当我将它传递给我的视图时,由于它不是强类型的,我怎么能用foreach迭代它,如果我不知道它里面有什么,我怎么能把它作为IQueryable或List? / p>

......是这样的吗?

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

只需要知道要为'???'放些什么我想。

2 个答案:

答案 0 :(得分:2)

您不能在定义范围之外使用匿名类型(选择新的{Property = value})。因此,您应该在定义查询的方法中使用foreach({yourQueryHere}中的var x)。

实施例: 这是可能的:

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

答案 1 :(得分:1)

您的linq查询返回匿名类型对象的集合。作为匿名者,在声明明确键入的变量时,无法“称呼他们的名字”。因此,对象的真实类型/形状仅在定义对象的动作方法中是已知的。

ViewData对象的索引getter的返回类型为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 }

您的对象现在共享一个名为的常见类,您的集合可以轻松地在视图中投放到正确的类型。