﻿# Dynamic LINQ 讓 LINQ 的世界變的更美好

身為一個程式設計師最討厭的就是被侷限在框框裡寫程式，我們唯一的限制應該是在我們的創意而非架構。像 LINQ 剛出來的時候我覺得超級好用，不過等用在專案上實做的時候才發現綁手綁腳的，想要動態組成一個 LINQ 語法難上加難，結果過沒多久就在 [ScottGu's Blog](https://weblogs.asp.net/scottgu/) 看到一篇 [Dynamic LINQ (Part 1: Using the LINQ Dynamic Query Library)](https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library)，看到的時候好像挖到寶一樣，以前在開發時卡住的問題全部都解決了，從今年 2 月份用到現在簡直是幾乎忘了它的存在，以致於這幾個月都沒有提及 Dynamic LINQ 這個好東西，直接上週一個朋友問我：『LINQ 的 Where 條件可以像以前組 SQL Command 一樣動態組裝嗎？』，我馬上跟他說有 Dynamic LINQ 這個東西，不用多說，他跟我剛看到 Dynamic LINQ 的時候一樣覺得：Bravo! ( 太棒了 )

這個 Dynamic LINQ 其實也跟我曾經介紹過的 [好用的 Linq Samples and the Sample Query Explorer](/post/2008/05/05/About-Linq-Samples-and-the-Sample-Query-Explorer) 一樣，早就出現在 VS2008 的 [CSharpSample](https://web.archive.org/web/20080128114405/http://code.msdn.microsoft.com:80/csharpsamples) 裡面了，有需要的人可以到[這裡](http://msdn2.microsoft.com/en-us/vcsharp/bb894665.aspx)下載，下載回來後這個 Library 放在 \\LinqSamples\\DynamicQuery\\ 專案裡，專案裡面有個 Dynamic.cs 是一堆 Extension Methods，用來擴充 LINQ 的現有功能，程式碼有點複雜，想專精 LINQ 的人可以好好研究一下這些原始碼，共有 2,027 行。如果沒空看也沒關係，會用就很夠了，你可以看專案內的 Program.cs 提供一些簡單的範例，不用多說，看個範例你就知道他在做什麼了：

```
Northwind db = new Northwind(connString); 
db.Log = Console.Out;

var query =
    db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10).
    OrderBy("CompanyName").
    Select("New(CompanyName as Name, Phone)");

Console.WriteLine(query);
Console.ReadLine();
```

我介紹到這裡就好，大家如果有感覺的話，可以到 [Dynamic LINQ (Part 1: Using the LINQ Dynamic Query Library)](https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library) 或 [动态LINQ （第一部分：使用LINQ动态查询库）](https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library/) 查看更完整的範例，或者可以用搜尋引擎查詢 Dynamic LINQ 也可以找到一堆資料。

不過，使用 Dynamic LINQ 有個缺點，就是這種寫法就會失去編譯時期偵錯(Compile-time Debugging)的機會，如果你自己組成的 LINQ 語法有問題的話，就必須要到執行時期(Runtime)才有可能找到錯誤了，這時你就必須要做好錯誤處理(Error Handling)才行！
