LINQ 支援在 Select 投影中建立巢狀結構,外層物件的某個屬性本身就是一個子集合:
var q = from o in db.Orders
select new {
o.OrderID,
DiscountedProducts = from od in o.OrderDetails
where od.Discount > 0.0
select od,
FreeShippingDiscount = o.Freight
};
回傳的每個訂單物件,其 DiscountedProducts 屬性包含一個「有折扣的明細」子集合。這在處理主從關係資料時極為方便。
要取得不重複的城市清單:
var q = (from c in db.Customers
select c.City).Distinct();
對應的 SQL 為 SELECT DISTINCT City FROM Customers。
// 查詢語法
var q = from c in db.Customers
where c.City == "London"
select c;
// 方法語法
var q = db.Customers.Where(c => c.City == "London");
// AND 條件
var q = from p in db.Products
where p.UnitsInStock <= p.ReorderLevel && !p.Discontinued
select p;
// OR 條件
var q = from p in db.Products
where p.UnitPrice > 10m || p.Discontinued
select p;
// 串聯 Where(等價於 AND)
var q = db.Products
.Where(p => p.UnitPrice > 10m)
.Where(p => p.Discontinued);
多個 Where 串聯或單一 Where 使用 &&,最終轉譯的 SQL 幾乎相同。
First 相當於 SQL 的 TOP 1,並立即執行查詢,回傳單一實體而非集合:
// 條件單筆查詢
Customer cust = db.Customers.First(c => c.CustomerID == "BONAP");
Order ord = db.Orders.First(o => o.Freight > 10.00M);
// 結合查詢語法
var q = (from c in db.Customers
where c.City == "London"
select c).First();
注意:First 必須以方法鏈結形式呼叫;若無符合條件資料會拋出例外,若需避免例外可改用 FirstOrDefault。