使用SQL Server上的LINQ和链接服务器到oracle db

时间:2014-09-23 07:50:15

标签: c# sql sql-server oracle linq

我想知道我是否可以在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在分秒内执行。由于涉及的数据大小,这使得该方法不可用。任何其他建议将不胜感激。

1 个答案:

答案 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服务器上执行。