將不確定變為確定~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這個新世界里,有着很多我們不清晰,而且微軟自己也不太清楚的概念,這需要我們自己去探討,呵呵。

回到目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM