2009-06-09 54 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列) 。

相关问题