我有一个存储过程,它返回我的实体类对象的集合。由于我希望我的导航属性也已填充,因此我使用EF Extensions并编写了自己的Materializer
类。
但是。我的实体类具有Type
的导航属性,指向不同的实体。存储过程当然会从查找表(外键)返回一个ID。
我想填充我的类型,好像我正急切地加载一个相关的实体。我如何在Materializer中执行此操作? 我是否可以在没有返回两个结果集的存储过程的情况下执行此操作?
我想实现类似于Include()
扩展方法在LINQ语句中对源选择所做的事情。
答案 0 :(得分:0)
前段时间我自己解决了这个问题。我只是在回答我自己的问题,如果有其他人需要的话。
那么存储过程应返回什么样的结果?这在很大程度上取决于关系类型。假设我们有两个表:TableOne
和TableTwo
。
在这种情况下,存储过程应该立即返回:
select t1.*, t2.*
from TableOne t1
[left] join TableTwo t2
on t2.key = t1.key
当它们是1:1时,您可以轻松省略left
。
在这种情况下,编写返回更多结果的存储过程要容易得多。从一个旁边的人开始,以便在绑定多个边桌时准备好。
/* relation one */
select *
from TableOne
/* relation many */
select *
from TableTwo
但是如果您仍想返回单个结果集,则应检查每条记录是否已加载某个实体。有一个名为FindOrAttach()的方法可以帮助你。因此,每个结果都将返回两个实体,如果加载,则必须进行切换。如果不是,则实现......但如上所述:返回两个结果集要容易得多。
您还应编写存储过程以返回更多结果。在这种情况下,其中3个。
/* first table */
select *
from TableOne
/* second table */
select *
from TableTwo
/* relation *:* */
select *
from TableOne2Table2
像往常一样构建前两个表,然后为每个记录调用Attach,从而通过TableOne和TableTwo中的键加载结果。这也将填充实体集导航属性。
我回家,这会帮助别人,因为它帮助了我。