當我們使用Linq做排序或where查詢時會用expression表示如下
var query = SampleList.Where(c=>c.online==true).OrderBy(c=>c.Name);
但當我們只能用欄位名稱的字串來操作時,則需要額外多寫一堆程式碼來實現
IEnumerable很冗長吧…orderby(string condition, IEnumerable acc) { if(condition=="online") return acc.OrderBy(c=>c.online); else if(condition == "name") return acc.OrderBy(c=>c.Name); ....... }
如果我table欄位有一堆不就寫不完了
Dynamic Linq直接幫我們解決這方面的問題,直接來看吧。
先從Nuget 下載吧
宣告一個class
public class Car { public string Brand { set; get; } public string Color { set; get; } public int Count { set; get; } }
sample code
Where 要用參數方式代入 (@0, @1...)
Listcars = new List () { new Car(){Brand="honda", Color="White", Count=5 }, new Car(){Brand="toyota", Color="Red", Count=10 }, new Car(){Brand="Benz", Color="Black", Count=3 } }; Console.WriteLine("原始順序"); foreach(var c in cars) Console.WriteLine($"{c.Brand} {c.Color} {c.Count}"); Console.WriteLine("\r\n使用order count desc"); var query = cars.OrderBy("Count desc");//用descending也ok foreach (var c in query) Console.WriteLine($"{c.Brand} {c.Color} {c.Count}"); Console.WriteLine("\r\n使用where color=white"); var query2 = cars.Where(" Color=@0", "White"); foreach (var c in query2) Console.WriteLine($"{c.Brand} {c.Color} {c.Count}");
result
很方便吧,整個大大簡省了coding的時間
但這方法無法在編譯時知道是否有錯誤發生,只能在runtime時期才知道程式有錯
所以要做好錯誤處理,就是記得要加上try...catch啦

參考
dotblog搞搞就懂
沒有留言:
張貼留言