在SQL Server上使用LINQ,并将服务器链接到oracledb

本文关键字:服务器 链接 oracledb LINQ Server SQL | 更新日期: 2023-09-27 18:24:05

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

更新

我在sql server management studio中在链接的oracle服务器上设置了一个视图,如下所示。然后我运行了一个非常简单的查询:

select * from view where ID=1

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

在SQL Server上使用LINQ,并将服务器链接到oracledb

您可以在SQL Server中创建感兴趣的表的视图,并在这些表上使用EF或LINQ to SQL。通过这种方式,查询将被传输到Oracle服务器。

EF或LINQ to SQL不支持在表的完全限定名称上指定服务器部分。但是,如果你创建这样一个视图:

 create view MyView as SELECT * FROM LinkedServer.Database.Schema.Table

您可以像处理本地服务器中的表一样处理MyView,生成的SQL查询将直接在链接的Oracle服务器上执行。