我正在使用LINQ to SQL調用存儲過程並使用單個結果集(我發現了很多關於處理多個結果集的信息,但那不是我所做的)。結果集實際上是來自3個表的所有列連接在一起的,而且我對這3個表有LINQ to SQL實體。該模式是這樣的:使用LINQ to SQL獲取存儲過程中的多維結果
- 客戶1
- 訂購1
- 產品1
- 產品2
- 產品3
- 訂購2
- 產品4
- 訂購1
- 顧客2
- 訂單3
- 產品5
- 訂單4
- 產品6
- 產品7
- 訂單3
基本上,1個客戶很多訂單,1只爲了許多產品。因此,存儲過程的結果集實際上是每個產品的一行,但每行都包含所有Order和Customer列。在上面的例子中,存儲的proc將返回7行。
所以,問題是:我怎麼能得到2個Customer對象了LINQ to SQL的,各自有訂單收集填充,並且具有所有從存儲過程的結果充滿每個Order對象及其製品收藏?
我知道,如果你這樣做(DC是的LINQ to SQL的DataContext)...
var options = new DataLoadOptions();
options.LoadWith<Customer>(c => c.Orders);
dc.LoadOptions = options;
var customers = from c in dc.Customers select c;
...然後觀看獲取生成的SQL,它實際上將運行一個SQL語句將客戶加入訂單,從兩個列中選擇所有列,然後向客戶返回已填充訂單集合的不同客戶對象。我想要這種類型的對象的翻譯,但從我的存儲過程的結果。
我已經嘗試設置我的存儲過程,以客戶的返回類型,但與上面的例子中,我得到7個Customer對象(5點式兩份)不具有其訂單收集填充的集合。如果我然後遍歷其中一個Customer對象的Orders集合,我發現他們懶惰地加載了另一個往返數據庫的往返行程。然後,我嘗試將返回類型設置爲Product,並且確實獲得了7種產品,但是如果我嘗試訪問它,則它們的Order屬性將通過另一次往返來延遲加載。
我也曾嘗試治療結果作爲IMultipleResults,調用調用getResult <客戶>()和調用getResult <訂單>()和調用getResult <產品>()和手動拼接在一起。但是,在這種情況下,只有第一次調用GetResult < >()纔會返回一些結果(三種實體類型中的任何一種都可以使用,但僅限於第一個GetResult < >()調用)。第二個和第三個GetResult < >()調用返回null。
感謝任何人都可以提供的幫助。我一直認爲自己錯過了簡單的東西,或者LINQ to SQL沒有提供任何公共API來做到這一點(儘管它似乎是在上面的LoadsWith示例中自行完成的)。