我正在使用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示例中自行完成的)。