我正在使用LINQ to Entites将一些旧的SQL Server存储过程转换为EF4。 在一个场景中,我有一个存储过程,它从3个不同的Table_Valued函数中进行选择 像
Select * from Function1 F1 ,Function2 F2, Function3 F3
where F1.ID = F2.ID and
F2.ID = F3.ID (i am showing it simple)
其中Function1 F1,Function2 F2和Function3 F3是3个Sqlserver Table_Valued函数 返回表变量。
如果有人可以建议这种情况的最佳实践,那将是很好的, 目前我正在做的是有3种不同的C#方法(它们模仿与SQL服务器功能相同的功能),它返回一个集合,然后将所有这3个集合连接在一起以获得最终的结果集。
我们是否有另一种解决方案,因为我认为通过使用上述解决方案,代码调用3次调用数据库而不是一起调用everthing。
我希望代码调用一个大的SQL,而不是多个调用。
提前致谢!
答案 0 :(得分:1)
这里的主要问题是EF不支持表值函数。你的解决方案有另一个可怕的问题。使用三个模拟函数的.NET函数实际上会调用数据库三次(=最多可能是数据库的三次连续往返),但它也会将每个函数的整个结果集提取到应用程序,并在应用程序服务器的内存中执行连接。在大多数情况下,这是不可接受的。
正确的解决方案取决于函数的内部实现,因为它们可以转换为linq-to-entities或ESQL。如果没有,那么你仍然可以使用存储过程! EF的公共秘密是它不替代存储过程。使用它们时它们仍然是你的武器库的一部分。