2010-02-19 30 views
3

使用LINQ我想返回一個包含客戶和發票,他們有一個對象。如何返回多個類作爲IQueryable的<T>

我明白從方法返回一個類型:

public IQueryable<customers> GetCustomers() 
{ 
    return from c in customers 
      select c; 
} 

,但我有麻煩找出多個對象:

public IQueryable<???> GetCustomersWithInvoices() 
{ 
    return from c in customers 
      from inv in c.invoices 
      select new {c, ci} // or I may specify columns, but rather not. 
} 

我有一種感覺,我處理這個錯誤的方式。目標是從控制器調用這些對象,並將它們傳遞給視圖,可以是直接的或使用formViewModel類。

+0

可能重複的[Return anonymous type?](http://stackoverflow.com/questions/534690/return-anonymous-type) – nawfal 2014-06-28 07:38:22

回答

1

在第二種情況下要創建,其具有方法範圍的annonymous類型。要在方法邊界之外傳遞一個annonymous類型,您需要將返回類型更改爲object。然而,這違背了annonymous類型的目的(因爲你失去它提供了強大的打字),要求反射來獲取訪問屬性及其值的所述類型。

如果你想維護這個結構作爲你的返回類型,你應該創建一個由屬性組成的類或結構來保存客戶和發票值。

+0

這是有道理的,現在爲一個名字... :) – Brettski 2010-02-19 02:58:46

+0

我創建了一個類正在返回列表。我不喜歡它,但我只想返回一個對象並使用customer.invoices.invoiceid等來獲取數據。這似乎很混亂。 – Brettski 2010-02-19 03:55:06

+0

無論如何,你應該可以這樣做。在加載客戶對象時,打開DataContext以包含發票時,您只需指定DataLoadOptions即可。請參閱http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.loadwith.aspx – 2010-02-19 04:12:48

1

你不能從一個函數返回一個匿名類型,他們是嚴格的「內聯」課程。如果你想將它們封裝在一個函數中,你將需要創建一個具體類型來保存你的成員。

使用視圖模型,正如你所說,將是一個很好的地方,把它們。

Here是有關匿名類型的一個scottgu文章。從文章的結論是:

匿名類型是一個方便的 語言功能,使 開發人員能夠簡明地定義內聯代碼 CLR類型,而不必 ,明確規定類型的正式上課 聲明。雖然 它們可以在很多場景中使用,但是當使用LINQ查詢和轉換/整形數據時, 特別有用。

在該頁面的評論主題中有一些很好的討論。

+0

技術上你可以使函數的返回類型爲'object'或'IEnumerable '它會起作用。但是,對於結果是否可以做任何有用的事情都有爭議。 – 2010-02-19 02:35:42

+0

這正是我所苦苦掙扎的。我只想從客戶數據庫中查詢客戶和發票,發送並將其迭代到網頁中;這應該不復雜。 – Brettski 2010-02-19 02:56:51

0

如果你真的想,你可以做到這一點,但它是相當尷尬。

public IQueryable<T> GetCustomersWithInvoices(T exampleObject)
{
return from c in customers
from inv in c.invoices
select new {c, ci} // or I may specify columns, but rather not.
}

var exampleObject = new {
Customer c = new Customer(),
Invoice i = new Invoice()
};

var returnedObjectOfAnonymousType = GetCustomersWithInvoices(exampleObject);

通過這種方式,你可以利用類型推斷來獲取方法返回一個匿名類型。你必須使用這個醜陋的方法傳遞一個示例對象來使其運行。我並不真的建議你這樣做,但我相信這是做到這一點的唯一方法。

相關問題