【发布时间】:2009-06-09 16:18:42
【问题描述】:
我正在使用 LINQ to SQL 调用具有单个结果集的存储过程(我发现了很多关于处理多个结果集的信息,但这不是我正在做的)。结果集实际上是将 3 个表中的所有列连接在一起,并且我有这 3 个表的 LINQ to SQL 实体。架构是这样的:
- 客户 1
- 订单 1
- 产品1
- 产品 2
- 产品 3
- 订单 2
- 产品 4
- 订单 1
- 客户 2
- 订单 3
- 产品 5
- 订单 4
- 产品 6
- 产品 7
- 订单 3
基本上,1 个客户对应多个订单,1 个订单对应多个产品。因此,存储过程的结果集实际上是每个产品一行,但每一行都包含所有 Order 和 Customer 列。在上面的示例中,存储过程将返回 7 行。
所以问题是:如何从 LINQ to SQL 中获取 2 个 Customer 对象,每个对象都填充了 Orders 集合,并且每个 Order 对象的 Products 集合都填充了存储过程的结果?
我知道,如果您执行类似的操作(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 个客户对象(5 个重复项)的集合,这些对象的订单集合没有填充。然后,如果我遍历其中一个 Customer 对象的 Orders 集合,我会看到它们是延迟加载的,并带有另一个到数据库的往返行程。然后我尝试将返回类型设置为 Product,我确实得到了 7 个产品,但是如果我尝试访问它们,它们的 Order 属性会通过另一个往返延迟加载。
我还尝试将结果视为 IMultipleResults,调用 GetResult
感谢任何人提供的任何帮助。我一直在想我要么遗漏了一些简单的东西,要么 LINQ to SQL 没有提供任何公共 API 来执行此操作(即使在上面的 LoadsWith 示例中它似乎是自行执行此操作)。
【问题讨论】:
标签: linq linq-to-sql stored-procedures