将不确定变为确定~LINQ查询包含对不同数据上下文上所定义项的引用
我们在使用linq查询时,你的数据源可能是linq to sql或者是ef产生的,但只要是使用linq的语法去实现一个查询,就有可能出现“查询包含对不同数据上下文上所定义项的引用”的异常,这个异常很明显,是你在进行join表关联查询时使用了多个不同的DataContext对象,这是linq不允许的。
有了这个异常,就会出现一些解决方案,以下是我们可能的一些做法:
1 使用全局的static对象,但对于linq to sql来说,在高并发时,这个static对象会抛出一些莫明奇秒的异常,那时,我们会说,linq to sql不如ado.net靠的住。
2 使用单例模型创建对象,保证它在所有对象中使用同一个DataContext对象,在不使用db时,记住要dispose它呀,呵呵(这也是目前我的做法)。
3 保存在做join关联表时,将它全部约束在DAL层,它们的使用同一个基类下的GetModel()来得到结果集,这样是可以的。(使着有点不爽,太局限了)
今天,我们主要来说一下第三种方式,因为前两种在我的博文中有说过,大家可以去参考。
好了,从数据基类开始吧!(只是简单的实践,不是真实项目中的代码幼,呵呵)
1 建立DataBase
1 public abstract class DataBase 2 { 3 protected DataContext DB; 4 public DataBase() 5 { 6 this.DB = new LINQ.DataClasses1DataContext(System.Configuration.ConfigurationManager.ConnectionStrings["XXB"].ToString()); 7 } 8 public virtual IQueryable<TEntity> GetModel<TEntity>() where TEntity : class 9 { 10 return this.DB.GetTable<TEntity>(); 11 } 12 13 }
2 建立一个User_InfoRepository
1 public class User_InfoRepository : DataBase 2 { 3 /// <summary> 4 /// 需要把Join的表关系写在这里 5 /// </summary> 6 /// <returns></returns> 7 public IQueryable<User_Info> GetDetailModel() 8 { 9 var linq = from data1 in base.GetModel<User_Info>() 10 join data2 in base.GetModel<User_Profile>() on data1.UserID equals data2.UserID 11 select data1; 12 return linq; 13 } 14 }
3 建立一个User_ProfileRepository
1 public class User_ProfileRespository : DataBase 2 { 3 }
4 建立一个调用方法
如果是使用User_InfoRepository对象与User_ProfileRepository直接在外边做join时,它就会抛异常了,这是正常的,当然,如果它是正确的,那我们的
今天要说的第三种方案也是没有意义了,呵呵。
错误的作用(看着挻好,但它是一种“查询包含对不同数据上下文上所定义项的引用”的)
1 var linq2 = from data1 in new User_InfoRepository().GetModel<User_Info>() 2 join data2 in new User_ProfileRespository().GetModel<User_Profile>() on data1.UserID equals data2.UserID 3 select data1; 4 linq2.Take(10).ToList().ForEach(i => Console.WriteLine(i.UserName));
正确的(有点太局限了,所以,以后还是用第2种方案吧,呵呵)
1 var linq = from data1 in new User_InfoRepository().GetDetailModel() 2 select data1; 3 linq.Take(10).ToList().ForEach(i => Console.WriteLine(i.UserName));
事实上,在linq这个新世界里,有着很多我们不清晰,而且微软自己也不太清楚的概念,这需要我们自己去探讨,呵呵。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2011-08-01 XML遍历(LINQ TO XML的魅力)
2011-08-01 cookies可以跨域了~单点登陆(a.com.cn与b.com.cn可以共享cookies)
2011-08-01 EXCEL中如果输入一个数,然后自动让它乘以某个常数(第一列乘6,第二列乘4)