EF架(jia)構(gou)~為IEnumerable接口添加增(zeng)刪(shan)查等操(cao)作,原因是(shi)IEnumerable導航屬性(xing)更放心
對EF開發(fa)來說(shuo),導航屬(shu)性(xing)肯定都用過,事實上,它是(shi)由VS IDE工具(ju)根據(ju)你的(de)(de)(de)數據(ju)庫關(guan)(guan)系結構(gou)自(zi)動(dong)(dong)生成的(de)(de)(de)外鍵屬(shu)性(xing),在類(lei)視圖中可以看到相關(guan)(guan)屬(shu)性(xing),它是(shi)以外鍵表名(ming)來標識的(de)(de)(de),如果是(shi)一對多的(de)(de)(de)關(guan)(guan)系,那么,它會為屬(shu)性(xing)加上ICollection泛型集合用來標識,而今(jin)天我們(men)要說(shuo)的(de)(de)(de)當(dang)(dang)然不是(shi)自(zi)動(dong)(dong)生成的(de)(de)(de),而是(shi)手動(dong)(dong)加的(de)(de)(de)屬(shu)性(xing),這樣(yang)屬(shu)性(xing)需要我們(men)手動(dong)(dong)進(jin)行join,然后把它按(an)需賦值,而使(shi)用include當(dang)(dang)然是(shi)無效的(de)(de)(de),呵呵。
一般(ban)地(di),我們(men)習慣(guan)上把集(ji)(ji)合屬性定(ding)義為List<T>,但是(shi)(shi),對于linq to entities來(lai)說,這(zhe)個東西并不是(shi)(shi)很受歡迎,而(er)標準結(jie)果(guo)集(ji)(ji)大(da)家都(dou)知道是(shi)(shi)IEnumerable<T>,它是(shi)(shi)所(suo)有集(ji)(ji)合的(de)基類(lei),自身只提(ti)供了集(ji)(ji)合遍歷(li)的(de)方法,這(zhe)也是(shi)(shi)我們(men)不用(yong)它作為導航屬性的(de)原(yuan)因,因為我們(men)一般(ban)需(xu)要為導航集(ji)(ji)合賦(fu)值的(de),而(er)使用(yong)IEnumerable賦(fu)值就比較麻煩(fan),需(xu)要借(jie)助List等集(ji)(ji)合。
引(yin)入IEnumerable的原因主要是List無(wu)法實現一個復雜的查詢,如圖:
這個查詢返回一個派生類(lei)型,下面的復雜查詢將會用(yong)到上面的結果(guo),而這時,List類(lei)型的導航屬性將是不被允許(xu)的
我們通(tong)過(guo)監視器(qi)可以(yi)看到,查詢返回的(de)默認是IEnumerable,所(suo)以(yi),我們要屬性(xing)改為(wei)IEnumerable,結(jie)果當(dang)然是正常(chang)的(de)
而我們之前不(bu)用IEnumerable的原因(yin),就是(shi)因(yin)為它的方(fang)法太(tai)單調了(le),沒有添加,移(yi)除,查找等方(fang)法,而這(zhe)時,不(bu)用它又(you)不(bu)行,所以,只能把它進行擴展了(le),呵呵
擴展方法如下:
/// <summary> /// IEnumerable接(jie)口的擴展方法(fa),支持它的實現(xian)類是(shi)List的情(qing)況 /// </summary> public static class IEnumerableExtensions { /// <summary> /// 向集合中(zhong)添加(jia)元(yuan)素 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="collection"></param> /// <param name="value"></param> public static void Add<T>(this IEnumerable<T> collection, T value) { (collection as List<T>).Add(value); } /// <summary> /// 從集合中(zhong)刪除元素 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="collection"></param> /// <param name="value"></param> public static void Remove<T>(this IEnumerable<T> collection, T value) { (collection as List<T>).Remove(value); } /// <summary> /// 檢索(suo)集合中是否包含某個元(yuan)素 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="collection"></param> /// <param name="value"></param> /// <returns></returns> public static bool Contains<T>(this IEnumerable<T> collection, T value) { return (collection as List<T>).Contains(value); } }
調用也(ye)是(shi)十分簡單,和List類型的一樣樣,呵(he)呵(he),舒(shu)服!