我有一些需要通过存储过程返回的分层数据(因为直接LINQ-to-SQL无法真正处理递归)。让我们说这些是我正在使用的SQLMetal生成的两个对象:
class TableA_Record
{
public IEnumerable<Child_TableB> Child_TableB_Records;
}
class TableB_Record
{
public TableA_Record parent;
}
是否可以创建一个返回类似IEnumerable的存储过程,还可以同时提取Child_TableB_Records并填充它们?类似于此代码中的内容,但使用存储过程:
using(DataContext db = new DataContext())
{
DataLoadOptions dlOptions = new DataLoadOptions();
dlOptions.LoadWith<TableA_Record>(x => x.Child_TableB_Records);
db.loadOptions = dlOptions;
var query = from a in db.TableA
select a;
}
如果可能,我们将非常感谢任何示例或教程链接。提前谢谢!
答案 0 :(得分:2)
我不相信你想用Linq2Sql实现的目标。
然而,可能的解决方法是使用IMultiResult
接口。因此,您需要设置存储过程以返回两组结果(TableA_Record和TableB_Records)。您将存储过程添加到DBML并将对存储过程的调用更改为IMultiResult
,并且根据您使用Linq结果装饰方法的属性将填充在这些对象中。
Scott Gu LINQ to SQL (Part 6 - Retrieving Data Using Stored Procedures)有一个例子(名为“处理存储过程中的多个结果形状”一节)
然后,您必须采取额外步骤并将对象映射到您要查找的结构中。
您需要采取其他步骤,但我相信这与您尝试实现的目标最接近,因为您返回了一组您正在使用的结果。
编辑:
需要注意的一点是ResultType
属性的排序非常重要。返回的订单结果集是应该使用ResultType
属性来装饰方法的顺序。如果排序不正确,对象将只返回null并且不会抛出任何异常(我之前遇到过这种情况的问题)。
以下是一些其他示例: