將(jiang)不確(que)定變(bian)為(wei)確(que)定~Linq-Distinct()方法是(shi)否可以對復雜結果集進行去重?
linq中(zhong)也有像T—SQL的distinct方法(fa),可以將重(zhong)復的結(jie)果集去重(zhong),以下是我們使用 distinct()時需要注意的地方:
1 distinct去重(zhong)記錄要(yao)求每個(ge)字段都重(zhong)復時,才算重(zhong)復對(dui)象,這與T—SQL保持(chi)一(yi)至
2 disinct語(yu)句與orderby語(yu)句可以放在一起使(shi)用(yong),對彼此不產生影響
3 distinct是(shi)在數據庫端進行(xing)的(de)操(cao)作,即,你在linq中的(de)distinct與T-SQL的(de)distinct效果一樣,不會產生性能問題
4 distinct的數(shu)據(ju)集(ji)中(zhong)不能(neng)有復雜對象,如(ru)果出現List<T>這種引用類(lei)型(xing),那(nei)LINQ在解釋成T—SQL時,將(jiang)會把(ba)distinct()去掉(diao),從而使去重操(cao)作失效
實例:
1 DataClasses1DataContext db = new DataClasses1DataContext(); 2 var linq = from _data in db.Res_Item 3 join data2 in db.Res_ItemCategory on _data.ID equals data2.ItemID 4 join data3 in db.Res_ItemPrice on _data.ID equals data3.ItemID into list 5 select new Res_Item_Ext 6 { 7 ID = _data.ID, //列說明(ming): 產品編號 8 Name = _data.Name, //列說明(ming): 商品名(ming)稱 9 Res_ItemPrice=list.ToList(), 10 }; 11 var linq2 = linq.Where(i => i.ID == 5104).OrderBy(i => i.ID).Distinct().ToList(); 12 linq2.ForEach(i => Console.WriteLine(i.ID + i.Name));
由(you)于在結果集中出現(xian)List<T>這種復雜類型(xing),所以distinct()操作失效,如圖:
如果(guo)在結果(guo)集中沒(mei)有(you)復雜類型Res_ItemPrice屬(shu)性,那distinct()語句會生(sheng)效
結果是正確的: