将不确定变为确定~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这个新世界里,有着很多我们不清晰,而且微软自己也不太清楚的概念,这需要我们自己去探讨,呵呵。

本文转自博客园张占岭(仓储大叔)的博客,原文链接:将不确定变为确定~LINQ查询包含对不同数据上下文上所定义项的引用,如需转载请自行联系原博主。

目录
相关文章
|
2月前
|
Apache
判定数据中是否包含某一属性的方法
判定数据中是否包含某一属性的方法
|
3月前
【Azure Developer】使用PowerShell Where-Object方法过滤多维ArrayList时候,遇见的诡异问题 -- 当查找结果只有一个对象时,返回结果修改了对象结构,把多维变为一维
【Azure Developer】使用PowerShell Where-Object方法过滤多维ArrayList时候,遇见的诡异问题 -- 当查找结果只有一个对象时,返回结果修改了对象结构,把多维变为一维
|
5月前
去除程序名称 去除程序属性详细信息中的程序名称 创建时间等信息
去除程序名称 去除程序属性详细信息中的程序名称 创建时间等信息
33 0
|
存储 编译器 程序员
C++数据定义及相关操作
C++数据定义及相关操作
140 0
C++数据定义及相关操作
C结构中包含自己的嵌套定义
C结构中包含自己的嵌套定义
68 0
|
存储 开发框架 前端开发
C#特性 System.ComponentModel命名名空间属性方法大全,Syst em.ComponentModel命名空间的特性
目录: System.ComponentModel 特性命名空间与常用类 System.ComponentModel.DataAnnotations ComponentModel - Classes 类 ComponentModel - Structs 结构体 ComponentModel - Interfaces 界面 ComponentModel - Enums 枚举 ComponentModel - Delegates 委托
271 0
C#特性 System.ComponentModel命名名空间属性方法大全,Syst em.ComponentModel命名空间的特性
|
C++
VS 显示方法引用的设置方法
VS 中Codelens的设置面板没有相关的设置项?那如何调整出方法的引用呢?
2232 0
VS 显示方法引用的设置方法
Drools规则引擎-如果判断某个对象中的集合是否包含指定的值
Drools规则引擎-如果判断某个对象中的集合是否包含指定的值
313 0
|
iOS开发
Objective-C中通过下标的方式访问自定义数据模型中属性
Objective-C中通过下标的方式访问自定义数据模型中属性
149 0