我刚刚开始使用Entity Framework。我面临的问题是因为它是一个ORM,它将一切都模拟为现实世界的实体。因此,如果我获取父记录,则会自动获取子记录。如果我有1000个孩子的记录,即使我目前可能不需要它们,所有这些记录都会被取出。我认为这是非常低效的。
你会争论在Linq中使用Lazy Loading并因此解决问题,以便在访问SQL之前不会将SQL发送到SQL Server。但是,如果我在Web服务或基于WCF的环境中工作,该怎么办?在Web服务中,我们看到请求响应模型。而且我知道我们不能在Web服务中使用延迟加载,因为访问该属性时不会动态调用Web服务:d。
说我有order
和orderDetails
表。在某些情况下,我希望在我获取订单时orderDetails
,而在其他情况下,我不想orderdetails
。
我从未使用存储过程遇到过这个问题。但由于Linq是查询任何数据的标准,我正在接受它。
那么,我该如何解决这个问题呢?
提前致谢:)
答案 0 :(得分:1)
首先,即使使用Entity Framework,您也可以完全使用存储过程进行查询 - 没有问题。
下一步 - 如果您有时需要使用Order
的订单详情,有时则不需要 - 请指定一些参数 - 例如:
[OperationContract]
Order FetchOrder(int OrderID, int numDetails);
如果numDetails = 0
,您不会获取任何详细信息而且不会返回任何详细信息 - 如果您有numDetails = 10
,则会获取并返回前十个订单详细信息。你绝对可以在Linq-to-Entities中做到这一点。
在这种情况下,如果需要,您可能还需要进行某种操作来获取更多详细信息。
我认为这里没有任何架构问题 - 您只需要重新考虑并可能修改自己的服务合同,以处理有时加载详细信息的情况,有时不会。
答案 1 :(得分:0)
有几种方法可以实现预取(正面加载)。
阅读ADO .NET数据服务,特别是它作为IExpandProvider的支持(允许您指定要提前获取的相关实体以发送回WCF客户端): http://msdn.microsoft.com/en-us/library/cc907912.aspx
如果您真的想要进入延迟加载路径(即使在远程客户端方案中),我过去通过使用Castle或Unity(模拟框架也可以)来实现它,以创建覆盖属性的动态代理在我的实体上,如果它们在远程场景中使用,实际访问该属性会使后续的WCF调用出去并获取相关的实体。这会产生相当大的性能影响,因为有多个远程调用,除了处理动态编译的代码片段外,我避免使用此功能。