繁体   English   中英

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

[英]using LINQ on SQL Server with a linked server to oracle db

我想知道是否可以在SQL Server上执行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的链接服务器上使用LINQ并在服务器上执行它,以便在将数据传输到桌面之前完成数据操作吗? 我真的很想要LINQ的强大功能,而无需传输所有原始数据。

UPDATE

我按照以下答案中的建议,在链接的oracle服务器上的sql server management studio中设置了一个视图。 然后,我运行了一个非常简单的查询:

select * from view where ID=1

使用执行计划,这表明首先扫描了整个oracle表(远程扫描成本为100%),未在oracle服务器上执行查询。 同一查询通过openquery在几秒钟内执行。 由于涉及的数据量大,因此使该方法无法使用。 任何其他建议,将不胜感激。

您可以在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服务器上执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM