2020年5月17日 星期日

Dynamic LinQ 讓LinQ更彈性好用的Extension

無意間發現的好工具來記錄一下。

當我們使用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...)
List cars = 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搞搞就懂

沒有留言:

張貼留言

使用MVC Bundle後,CSS參考的相對路徑不對了??

MVC Bundle相當好用,可以把一堆css, js包在一起 bundles.Add(new StyleBundle("~/css/main").Include( "~/Content/Layout/main.css", ...