修改dbml实现linq跨数据库查询

  要做个跨数据库的查询,sql语句如下

select n.info_id,n.title,t.txt from news n
left join hqtcnewstype.dbo.newstype t on t.info_id=n.sys
order by n.uptime desc

结果

修改dbml实现linq跨数据库查询

  如果建立2个linq to sql类,使用如下的linq语句查询会出现错误“查询包含对不同数据上下文上所定义项的引用”错误。

            hqtcDataContext ctx = new hqtcDataContext();
            hqtcDataTypeContext ctx1 = new hqtcDataTypeContext ();
            var rs = from news in ctx.news
                     join type in ctx1.newstype on news.sys equals type.info_id into g
                     from t in g.DefaultIfEmpty()
                     orderby news.uptime descending
                     select new { 
                     t.txt,news.title,news.info_id,news.uptime
                     };

  百度查了不能从2个context从获取数据,要不会报错。翻墙谷歌找到一篇文章,修改dbml的xml配置文件中表配置的前缀来实现跨数据查询。

LINQ跨多个数据库

 

  在linq to sql类设计视图中,将2个表拖到同一个dbml中,保存后关闭dbml设计视图。然后右键点击dbml文件,点击“打开方式...”,XML(文本)编辑器。

这里注意,需要关闭此dbml设计界面,要不用xml编辑器打开dbml文件是空的,没有xml内容。

 

修改dbml实现linq跨数据库查询

vs2013 xml编辑器

linq to sql dbml

这样只需要一个linq to sql类就可以实现查询了

            hqtcDataContext ctx = new hqtcDataContext();
            var rs = from news in ctx.news
                     join type in ctx.newstype on news.sys equals type.info_id into g
                     from t in g.DefaultIfEmpty()
                     orderby news.uptime descending
                     select new { 
                     t.txt,news.title,news.info_id,news.uptime
                     };

用dbForge Event Profiler for SQL Server查看linq生成的sql语句如下图所示,完美解决linq跨数据库查询

dbForge Event Profiler for SQL Server查看linq生成的sql语句

最后一点需要注意的就是连接数据库的账号必须有对2个数据库表的读取权限,要写入还得加上写入权限之类的

加支付宝好友偷能量挖...


原创文章,转载请注明出处:修改dbml实现linq跨数据库查询

评论(0)Web开发网
阅读(19)喜欢(0)Asp.Net/C#