中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

將不確定變(bian)為確定~LINQ查詢包含(han)對不同數據(ju)上下(xia)文上所定義項的引用

回到目錄  

我(wo)們在使(shi)用(yong)(yong)(yong)linq查(cha)詢時,你的(de)(de)數據源可能(neng)是linq to sql或者是ef產生(sheng)的(de)(de),但只(zhi)要是使(shi)用(yong)(yong)(yong)linq的(de)(de)語法去實(shi)現(xian)一(yi)個查(cha)詢,就有(you)可能(neng)出現(xian)“查(cha)詢包含對(dui)不(bu)同數據上下(xia)文上所定義項的(de)(de)引用(yong)(yong)(yong)”的(de)(de)異常(chang),這個異常(chang)很明顯,是你在進行join表(biao)關聯查(cha)詢時使(shi)用(yong)(yong)(yong)了多個不(bu)同的(de)(de)DataContext對(dui)象(xiang),這是linq不(bu)允許的(de)(de)。

有了這(zhe)個異常,就會出現一(yi)些解決(jue)方(fang)案,以下是我們可能(neng)的一(yi)些做法:

1 使用全(quan)局的(de)static對(dui)象(xiang),但對(dui)于linq to sql來說,在高并發時,這個static對(dui)象(xiang)會(hui)拋(pao)出一些(xie)莫(mo)明奇秒的(de)異常,那時,我們會(hui)說,linq to sql不如ado.net靠的(de)住。

2 使用(yong)單例(li)模型創建對(dui)象(xiang),保證它(ta)在(zai)所(suo)有對(dui)象(xiang)中使用(yong)同(tong)一個(ge)DataContext對(dui)象(xiang),在(zai)不使用(yong)db時,記住(zhu)要dispose它(ta)呀,呵(he)呵(he)(這也是目前(qian)我的做法(fa))。

3 保存在做join關聯表時,將(jiang)它(ta)全部約束在DAL層(ceng),它(ta)們的(de)使(shi)用同(tong)一個基(ji)類下(xia)的(de)GetModel()來(lai)得到(dao)結果(guo)集,這樣是(shi)可以(yi)的(de)。(使(shi)著有點不爽,太局限了)

今天,我們主要來說一下第三種方式,因為前兩種在我的博文中有說過,大家可以去參考

好了,從數據基類開(kai)始吧(ba)!(只是簡單(dan)的(de)實(shi)踐(jian),不是真實(shi)項(xiang)目中的(de)代(dai)碼幼,呵呵)

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         /// 需要把(ba)Join的表關系寫在這(zhe)里
 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 建(jian)立一個User_ProfileRepository

1   public class User_ProfileRespository : DataBase
2     {
3     }

4 建立(li)一個調用方法

  如果是(shi)使用User_InfoRepository對象與User_ProfileRepository直接在外邊做(zuo)join時,它就會拋異(yi)常(chang)了(le),這是(shi)正常(chang)的,當然,如果它是(shi)正確的,那我們的

今天要說的第三(san)種方案也是沒(mei)有意義了,呵(he)呵(he)。

錯誤的(de)作用(看(kan)著挻好,但它是一種“查(cha)詢包含對(dui)不同數據上下文上所定義項的(de)引用”的(de))

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));

正確(que)的(有點太局限了,所以(yi),以(yi)后還是用第2種方案吧,呵(he)呵(he))

1        var linq = from data1 in new User_InfoRepository().GetDetailModel()
2                        select data1;
3             linq.Take(10).ToList().ForEach(i => Console.WriteLine(i.UserName));

事實上,在(zai)linq這個新世界里,有(you)著很(hen)多我(wo)們不清(qing)晰(xi),而且微軟自(zi)己(ji)(ji)也不太清(qing)楚的概念,這需要(yao)我(wo)們自(zi)己(ji)(ji)去探討,呵呵。

回到目錄

posted @ 2012-08-01 16:56  張占嶺  閱讀(2337)  評論(8)    收藏  舉報