最近帶一個新人,被問到Linq的一點東西,回答他後,自己記錄下,防止自己懵逼。
Linq中查詢一個表中指定的幾個字段:
var ts = t.FindAllItems().Where(P => P.ProductId== outProductId).Select(s => new { ProductName= s.DescProductName,Supplier=s.ProductSupplier}).Distinct().ToList().OrderByDescending(s => s.ivrId).Take(15);
// FindAllItems()為查詢對應表的所有數據的方法;
// Where 裡面為查詢條件
// Select 為查詢的篩選條件 new{} 裡面就是要查詢的字段
//Distinct() 為去除重復的查詢
//ToList() 為將查詢轉換為List<>
//OrderByDescending() 表示排序字段及排序方法(倒序排列)
//Take(N) 表示查詢前N條數據;
附加兩個.net程序員寫代碼的和Linq相關兩個誤區:
1、使用迭代式 (而不是聲明式)的語句去操作集合
//Bad decimal total = 0; foreach (Account account in myAccounts) { if (account.Status == "active") { total += account.Balance; } } //Good decimal total = (from account in myAccounts where account.Status == "active" select account.Balance).Sum();
一個單一的LINQ語句可以輕易地替換掉你代碼中一個迭代循環(或嵌套循環)裡的幾十條語句。更少的代碼通常意味著產生Bug的機會也會更少地被引入。
然而,記住,在性能方面可能要權衡一下。在性能很關鍵的場景需要權衡使用。
2、在LINQ語句之中沒有考慮底層對象
decimal total=(from accout in myaccouts where accout.status=="active" select accout .Balance).sum();
如果myaccout是Dbset的對象。(默認設置了不同區分大小寫的配置),where表達式仍會匹配該元素。然而,如果myaccout是在內存陣列之中,那麼它將不匹配,因此將產生不同的總的結果。