为什么Entity-爆料-Framework不能进行跨数据库查询 (为什么entp感觉很聪明)

教程大全 2025-07-12 02:54:40 浏览

在上篇随笔中提到“对于跨数据库查询,我们没有找到通过LINQ to Entities实现的方法”。后来仔细想想,从理论来讲,实现跨数据库查询应该不难啊,与非跨数据库查询相比,只是多了个数据库名,比如下面的非跨数据库查询语句:

跨数据库查询语句:

在Entity Framework中,我们可以通过ToTable(“表名”)指定表名进行映射,Entity Framework会根据指定的表名构建sql语句,如果在这里加上数据库名和Schema名(也就是ToTable(“数据库.dbo.表名”)),是不是可以实现跨数据库查询呢?

于是,我们根据这个思路进行了试验,结果发现了Entity Framework不能进行跨数据库查询的秘密:Entity Framework会对ToTable()中指定的表名进行处理,加上中括号,如果没有指定Schema名,会在表名前加上[dbo],比如:ToTable(“表名”),SQL语句中的表名是[dbo].[表名]。而在加“中括号”时的不正确有处理,成为了罪魁祸首。

爆料

我们试图组装一些特殊字符串骗过Entity Framework,都没成功。目前我们在用Reflector在Entity Framework的代码中寻找凶手,只有找到了凶手,知道了作案手段,才能知道是否有可能解决这个问题。

下面用代码爆一下料:

BlogDbContext的代码:

LINQ to Entities查询代码:

1. 这是非跨数据库查询的情况,生成的SQL语句如下:

指定的表名是blog_PostBody,SQL语句中变成了[dbo].[blog_PostBody]。

2. 跨数据库查询:

BlogDbContext的代码改为:

生成的SQL语句:

CNBlogsText.dbo被整个加在了中括号中,正确的应该是[CNBlogsText].[dbo].[blog_PostBody]。

试图欺骗一下Entity Framework,将表名改为:

生成的SQL语句:

多出了半个中括号,欺骗失败…

要想真相大白,只有找出Entity Framework中这部分处理的代码,昨天用Reflector苦苦寻觅了一个晚上未果,今天继续寻觅…

原文链接:

【编辑推荐】


.net中这句话是什么意思??this.Entity.Address_ID=.....

[0][Address_ID] == ( 数据库内的空值)如果两个相等,则_ID =_ID(即原值)否则_ID=[0][Address_ID]()Entity这个是用户自己定义的一个类,Address_ID是类的成员变量希望你能懂。 。

Oracle 如何去掉一个字段串内重复记录

oracle中在一张表中某个字段下面有重复记录,有很多方法,但是有一个方法,是比较高效的,如下语句:SELECT data_guidFROM adam_entity_datas a WHERE > (SELECT MIN()FROM adam_entity_datas b WHERE _guid = _guid)如果表中有大量数据,但是重复数据比较少,那么可以用下面的语句提高效率SELECT data_guidFROM adam_entity_datas WHERE data_guid IN (SELECT data_guid FROM adam_entity_datasGROUP BY data_guid HAVING COUNT(*) > 1)此方法查询出所有重复记录了,也就是说,只要是重复的就选出来,下面的语句也许更高效SELECT data_guidFROM adam_entity_datas WHERE ROWID IN (SELECT rid FROM (SELECT ROWID rid,row_number() over(Partition BY data_guid ORDER BY ROWID) m FROM adam_entity_datas)WHERE m <> 1)

如何将CHECKBOXLIST中取得值个数据库中的值进行比较

首先要和数据库连接,能够读取数据库里的数据,所进行的比较都是在后台代码中进行的 数据库连接的方法很多种,像,EntityFramework,LinQ,以为例首先创建一个ConnectionSqlConnection con = new SqlConnection(连接字符串);//怎么得到连接字符串,上网查查();//如果这一步失败检查连接字符串,或SQL Server 的配置SqlCommand cmd = ();//通过联接来生成执行SQL语句的 = Select * from table;//这个Text是你要查询的东西,是一条SQL语句SqlDataReader reader = ();//执行Command,取得结果然后将这个结果与你的选中的CheckBox进行对比reader[] == ??//reader引号间用你刚才执行的Sql语句所选出来的字段名

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐