2009-12-02 22 views
4

所以我有這個LINQ查詢,在一個自定義的結尾選擇有點兒像這樣:通過沒有特定類型的IQueryable迭代?

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

從控制器,可查詢的呼叫看起來是這樣的:

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

現在,當我通過這對我的看法,因爲它不是強類型我怎麼能遍歷它與foreach,我怎麼能把它作爲IQueryable或列表,如果我不知道它是什麼?

...是這樣的嗎?

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

只需要知道'???'我認爲。

+1

'var these = ...'? – 2009-12-02 12:55:15

+0

var無法成爲返回類型:) – Webleeuw 2009-12-02 13:01:44

+0

GetAllThese()'的返回類型是什麼? – 2009-12-02 13:09:44

回答

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 } 

你現在的對象都有一個共同的名爲類,並且您的收藏可以很容易地鑄造在視圖中正確的類型。

2

您不能在定義範圍外使用匿名類型(選擇新的{Property = value})。所以,你應該從該方法中你定義在查詢中使用的foreach(VAR中的x {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 }; 
    }