2013-05-09 34 views
0

MSDN文檔說我可以寫這樣LINQ到存儲過程的多個選擇

CREATE PROCEDURE MultipleResultTypesSequentially 
AS 
select * from products 
select * from customers 

一個存儲過程,然後從LINQ看它像這樣

IMultipleResults sprocResults = 
    db.MultipleResultTypesSequentially(); 

// First read products. 
foreach (Product prod in sprocResults.GetResult<Product>()) 
{ 
    Console.WriteLine(prod.ProductID); 
} 

// Next read customers. 
foreach (Customer cust in sprocResults.GetResult<Customer>()) 
{ 
    Console.WriteLine(cust.CustomerID); 
} 

如果我的SELECT語句的一個回報是什麼除了常規表格對象之外的其他東西 - 是否加入了連接或僅選擇了某些列?

我該如何讓LINQ知道我想讀取下一個SELECT?基本上,我想知道的是,這個例子是從MSDN讀取產品,然後是客戶的例子,因爲它們是按照存儲過程中的順序編寫的,或者正在編寫.GetResult<Customer>()告訴c#查找映射到Customer類型的結果。以及這個未知類型的foreach循環是什麼樣的?

回答

1

我做了一個快速測試具有相似的存儲過程,並發現,如果你foreach循環是不正確的順序,一個InvalidOperationException被拋出,所以它看起來並不像C#是能夠找到基於正確的結果在GetResult<>中使用的類型。

至於你的select語句返回的是表以外的內容,如果你將存儲過程從服務器資源管理器拖到Linq to Sql設計器上,設計器將根據過程輸出自動生成一個類。我用一對連接表創建了一個過程,這兩個表都沒有存在於我的項目中,並且Linq to Sql爲我創建了一個名爲StoredProcedureNameResult的類型,因此名爲GetCreditCard的過程有一個名爲GetCreditCardResult的類型。