我想知道我是否可以在SQL服务器上执行LINQ以加快查询速度。
我将举一个简单的例子。目前我用它来填充我的数据表:
using (var connection = new SqlConnection())
using (var da = new SqlDataAdapter())
using (da.SelectCommand = connection.CreateCommand())
{
da.SelectCommand.CommandText = newcmd;
da.SelectCommand.Connection.ConnectionString = connstring;
da.SelectCommand.CommandTimeout = 0;
DataTable ds = new DataTable(); //conn is opened by dataadapter
da.Fill(ds);
}
使用此命令:
newcmd = "select * from openquery("LinkedServer", 'select * FROM tbl_oracle p ')";
然后,一旦我在DataTable中获得数据,我就会使用LINQ来操作我认为合适的数据。但是这意味着我必须转移整个桌子!
由于这会在实际查询中返回大量数据,因此下面(简单的总和示例)变得更快(主要是因为接口/传输速率)。
newcmd = "select * from openquery("LinkedServer", 'select p.timestep, SUM (p.position)
FROM tbl_oracle p GROUP BY p.timestep ')";
显然,实际上数据操作更复杂。所以我的问题是:
我可以在oracle db或SQL Server上的Linked Server上以某种方式使用LINQ并在服务器上执行它,以便在数据传输到桌面之前完成数据操作吗?我真的很喜欢LINQ的强大功能,而不需要转移所有的原始数据。
更新
我在链接的oracle服务器上的sql server management studio中设置了一个视图,如下面的答案所示。然后我运行了一个非常简单的查询:
select * from view where ID=1
有执行计划,这表明首先扫描整个oracle表(远程扫描100%成本),oracle服务器上不执行查询。相同的查询通过openquery在分秒内执行。由于涉及的数据大小,这使得该方法不可用。任何其他建议将不胜感激。
答案 0 :(得分:1)
您可以在SQL Server中创建感兴趣的表的视图,并在该表上使用EF或LINQ to SQL。这样,查询将转移到Oracle Server。
EF或LINQ to SQL不支持在完全符号化的表名称上指定服务器部分。但是,如果您创建这样的视图:
create view MyView as SELECT * FROM LinkedServer.Database.Schema.Table
您可以在MyView
上工作,就像它是本地服务器中的表一样,生成的SQL查询将直接在链接的Oracle服务器上执行。