ALinq Dynamic 使用指南——慨述(上)

麥舒發表於2014-05-15

一.使用

1.程式集與名稱空間的引用
使用 ALinq Dynamic,你需要引用ALinq.Dynamic.dll(ALinq使用者)或者System.Data.Linq.Dynamic.dll (Linq to SQL使用者),在使用時,還需要引入ALinq.Dynamic名稱空間。當然,使用前你還需要完成建模的工作,本文假設你已經會了,否則請參考Linq to SQL或ALinq教程。

示例一

下面的示例,由於使用到dynamic關鍵字,必須執行在.NET Framework4或以上。

using System;
using ALinq.Dynamic;
using NorthwindDemo;
namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var db = new NorthwindDataContext();
            var q = db.CreateQuery("select e.FirstName, e.LastName from Employees as e");
            foreach (var item in q)
            {
                var e = item as dynamic;
                Console.WriteLine("{0} {1}", e.FirstName, e.LastName);
            }
        }
    }
}

示例二

下面的示例可以執行在.NET Framework 3.5(為了便於閱讀以及節省編幅,僅給出關鍵部份程式碼)。

var db = new NorthwindDataContext();
var q = db.CreateQuery<IDataRecord>("select e.FirstName, e.LastName from Employees as e");
foreach (var e in q)
    Console.WriteLine("{0} {1}", e["FirstName"], e["LastName"]);

二.大小敏感

1.關鍵詞不區分大小寫

對於關鍵詞是不區分大小寫的,例如下面的這兩條ESQL語句是相等的。

語句一

select p from Product as p

語句二

SELECT p FROM Product AS p

2.名稱空間區分大小寫

對於名稱空間,是區分大小寫的,例如下面的兩條ESQL語句是不等價的。

語句一

using NorthwindDemo 
select p from Product as p

語句二

using NORTHWINDDEMO
SELECT p FROM Product AS p

這是因為名稱空間是區分大小區的,NorthwindDemo 和 NORTHWINDDEMO是不等價的。

三.名稱空間

1.using 關鍵字

通過使用 using 關鍵字,可以引入名稱空間,避免使用全域性標識。例如:

var esql = @"using NorthwindDemo;
             select e.FirstName, e.LastName 
             from Employee as e";
var q1 = db.CreateQuery(esql);

其等效於:

var esql = @"select e.FirstName, e.LastName 
             from NorthwindDemo.Employee as e";
var q1 = db.CreateQuery(esql);

2.預設引用的名稱空間

在使用 CreateQuery 方法進行查詢的時候,ALinq Dynamic 會自動引入 DataContext 所在的名稱空間。例如:

var db = new NorthwindDemo.NorthwindDataContext();
var esql = "select e.FirstName, e.LastName from Employee as e";

由於 DataContext ,即 db 變數,對應的實體類名稱空間為 NorthwindDemo, esql 語句會自動引入 NothwindDemo 名稱空間,即等效於下面的語句:

var db = new NorthwindDemo.NorthwindDataContext();
var esql = @"using NorthwindDemo;
             select e.FirstName, e.LastName from Employee as e";

四.識別符號

1.簡單識別符號

識別符號由字母,數字,和下劃線組成,並且第一個字元必須是字母(a-z或A-Z)。

2.帶引號的識別符號

帶引號的識別符號是括在方括號([])中的任意字元序列。使用帶引號的識別符號可以指定含有在識別符號中無效的字元的識別符號。方括號中的所有字元都是識別符號的一部分,包括所有空格。
但是,帶引號的識別符號,第一個字元不能是數字,並且不能包含以下字元:

換行符
回車符
製表符
Backspace
額外的方括號(即括起識別符號的方括號中的方括號)。
單引號(即:')
雙引號(即:")

使用帶引號的識別符號可以建立在識別符號中無效的屬性名稱字元,如下面的示例所示:

var esql = "select c.ContactName as [Contact Name] from Customers as c";
var q = db.CreateQuery(esql).Execute();

使用帶引號的識別符號,還可以指定關鍵字作為識別符號。例如,如果型別 Email 具有名為“From”的屬性,則可以使用方括號來消除與保留關鍵字“FROM”的歧義,如下所示:

var esql = "select e.[From] from Emails AS e";

但是下面的例子是非法的
識別符號中帶引號

var esql = "select c.ContactName as ['Contact Name'] from Customers as c";

識別符號以數字開始

var esql = "select c.ContactName as [0ContactName] from Customers as c";

3.別名規則

如果需要,建議在查詢中指定別名,別名可以應用於:

行建構函式
查詢語句的 FROM 子句
查詢語句的 SELECT 子句
查詢語句的 GROUP BY 子句

有效的別名
有效的別外包括簡單識別符號或者帶引號的識別符號

五.引數

引數是查詢語句之外定義的變數,引數名在查詢語句中定義,並以(@)符號作為字首。這可以將它們與屬性名或查詢中定義的其它名稱區分開來。引數為兩類,命名引數和順序引數,對於命名引數,必須指名稱,引數的傳遞不要按照順序。順序引數不需要指定名稱,在查詢語句中使用序號(序號從0開始)作為引數名,引數必須按順序傳遞。

命名引數

var esql = @"select e from Employees as e
         where e.FirstName = @f and e.LastName = @l";
var q = db.CreateQuery(esql, new ObjectParameter("l", "mak"), new ObjectParameter("f", "mike"));

順序引數

var esql = @"select e from Employees as e
         where e.FirstName = @0 and e.LastName = @1";
var q = db.CreateQuery(esql, "mike", "mak");

六.變數

變數表示式是對當前作用域中定義的命名錶達式的引用。變數引用必須是有效的識別符號。
以下示例演示如何在查詢語句中使用變數。FROM 子句中的 c 是變數定義。在 SELECT 子句中使用的 c 表示變數引用。

var esql = "select c.ContactName from Customers as c";