Entity framework LINQ到加入多个集合的实体

Entity framework LINQ到加入多个集合的实体,entity-framework,Entity Framework,我正在使用LINQ to Entite将一些旧式SQL Server存储过程转换为EF4。 在一个场景中,我有一个从3个不同的表值函数中选择的存储过程 像 其中,function1f1、function2f2和function3f3是3个Sqlserver表值函数 返回表变量 如果有人能建议这种情况下的最佳做法, 目前,我正在做的是使用3种不同的C#方法(模仿SQL server函数的相同功能)返回一个集合,然后将所有这3个集合连接在一起以获得最终结果集 我们是否有其他解决方案,因为我认为通过使

我正在使用LINQ to Entite将一些旧式SQL Server存储过程转换为EF4。 在一个场景中,我有一个从3个不同的表值函数中选择的存储过程 像

其中,function1f1、function2f2和function3f3是3个Sqlserver表值函数 返回表变量

如果有人能建议这种情况下的最佳做法, 目前,我正在做的是使用3种不同的C#方法(模仿SQL server函数的相同功能)返回一个集合,然后将所有这3个集合连接在一起以获得最终结果集

我们是否有其他解决方案,因为我认为通过使用上述解决方案,代码将调用3个数据库调用,而不是一起调用所有东西

我希望代码调用一个大SQL,而不是多个调用


提前谢谢

这里的主要问题是EF不支持表值函数。你的解决方案还有一个可怕的问题。使用三个.NET函数模拟您的函数实际上会调用数据库三次(=很可能是对数据库的三次连续往返),但它也会将每个函数的整个结果集拉到应用程序中,并在应用程序服务器的内存中执行联接。在大多数情况下,这是不可接受的


正确的解决方案取决于函数的内部实现,因为它们可能可以转换为LINQtoEntities或ESQL。如果没有,那么您仍然可以使用存储过程!EF的公开秘密是它不替换存储过程。使用它时,它们仍然是你的武器库的一部分。

我使用Linq来处理那些返回集合的3个C#方法中的实体。我在想,如果我返回一个IQueryable而不是集合,它会作为一个SQL执行吗?例如,如果方法1和方法2都返回IQueryable,如果我写一条语句,var q=方法1中的m1,方法2中的m2,其中m1.Id==m2.Id选择m1.Name;int count=q.count();最后一条语句不应该作为数据库中的一个SQL运行吗?这与您最初的描述有很大的不同<代码>IQueryable不是一个集合。在这种情况下,这取决于方法的编写方式。它们确实可以在数据库上执行,并且所有三个with JOIN都可以在单个数据库往返中进行评估。您可以使用SQL Profiler或将final
IQueryable
转换为
ObjectQuery
并选中
ToTraceString
来验证确切的查询是什么,谢谢!我将把我所有的方法返回参数改为IQueryable,看看会发生什么。之前它返回列表,我加入了3个集合。
 Select * from Function1 F1 ,Function2 F2, Function3 F3
 where F1.ID = F2.ID and
       F2.ID = F3.ID  (i am showing it simple)