Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在SQL Server上使用LINQ并将服务器链接到oracle db_C#_Sql_Sql Server_Oracle_Linq - Fatal编程技术网

C# 在SQL Server上使用LINQ并将服务器链接到oracle db

C# 在SQL Server上使用LINQ并将服务器链接到oracle db,c#,sql,sql-server,oracle,linq,C#,Sql,Sql Server,Oracle,Linq,我想知道是否可以在SQL server上执行LINQ以加快查询速度 我将举一个简单的例子。目前,我使用它来填充我的数据表: using (var connection = new SqlConnection()) using (var da = new SqlDataAdapter()) using (da.SelectCommand = connection.CreateCommand()) { da.Se

我想知道是否可以在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来处理我认为合适的数据。但是这意味着我必须转移整个桌子

由于这会在实际查询中返回大量数据,下面的(简单求和示例)结果要快得多(主要是因为接口/传输速率)

显然,在现实中,数据操作更为复杂。因此,我的问题是:

我是否可以在oracle db或SQL Server上的链接服务器上使用LINQ,并在服务器上执行它,以便在数据传输到桌面之前完成数据操作?我真的很想在不传输所有原始数据的情况下使用LINQ的强大功能

更新

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

select * from view where ID=1

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

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

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

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

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

谢谢。我必须使用schema.table还是可以在普通sql上创建视图?我的问题是,实际上我的oracle sql已经连接了oracle db上的几个表……如果使用由四部分组成的名称创建视图,查询将被构造为“普通”sql查询,因此它将被发送到oracle服务器。Oracle服务器将像执行本地查询一样执行它,因此它是Oracle端的真实表还是视图并不重要,因为Oracle将完美地处理它。如果您使用
openquery
创建视图,如果可能的话,SQL Server会将openquery的查询发送到Oracle执行,获取结果,并在本地完成查询(过滤、排序…),因此您会将问题从应用程序移到SQL Server。我尝试了这个方法,但视图速度非常慢!似乎它首先将整个视图从Orcale下载到SQL(这本身就是太多的数据),因此,我看到的这种方法的唯一选择是,在视图创建时要具体,然后只在LINQ中执行其余的操作-但我希望在LINQ中执行所有操作您是否尝试过直接在SSMS中对远程视图执行查询?它同样慢吗?根据wuery的外观,它可以传输到Oracle,也可以不传输。请试试,我就是这么做的。非常简单,直接在SSMS中从id=1的视图中选择*,但很长一段时间没有完成-如果我通过openquery执行相同操作,则需要几秒钟。。。
 create view MyView as SELECT * FROM LinkedServer.Database.Schema.Table