2009-06-09 52 views
3

我正在使用LINQ to SQL調用存儲過程並使用單個結果集(我發現了很多關於處理多個結果集的信息,但那不是我所做的)。結果集實際上是來自3個表的所有列連接在一起的,而且我對這3個表有LINQ to SQL實體。該模式是這樣的:使用LINQ to SQL獲取存儲過程中的多維結果

  • 客戶1
    • 訂購1
      • 產品1
      • 產品2
      • 產品3
    • 訂購2
      • 產品4
  • 顧客2
    • 訂單3
      • 產品5
    • 訂單4
      • 產品6
      • 產品7

基本上,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示例中自行完成的)。

回答

0

我可以拿出最好的解決辦法是這樣的:

  1. 修改存儲過程的實際(從上面的例子中,客戶,訂單和產品)返回多個結果集
  2. 使用IMultipleResults像往常一樣(有大量的文檔和這方面的例子的)對LINQ到SQL側得到這些3個獨立IEnumerables
  3. 創建每個非根實體的分組的集合,即var groupedOrders = allReturnedOrders.GroupBy(order => order.CustomerID)var groupedProducts = allReturnedProducts.GroupBy(p => p.OrderID)
  4. 環路救援人員到場唉非葉對象,並使用EntitySet.SetSource()方法來填充其關聯對象的集合,即customer.Orders.SetSource(groupedOrders.Single(orderGroup => orderGroup.Key == customer.CustomerID)

這得到你平時的實體從DBML對象在內存中,這是不是很碼(2-3行您正在創建的層次結構中的每個級別)。它確實涉及到修改sproc,但實際上它應該減少數據庫中的數據傳輸,因爲您並未重複所有更高級別的數據,例如連接所有表將執行的操作(在上例中爲每個產品重複Customer和Order列) 。

相關問題