LINQ、Lambda、SQL基本介紹
LINQ/Lambda介紹
LINQ
Language Integrated Query (LINQ) 是一組以直接將查詢功能整合至 C# 語言為基礎之技術的名稱。在以往的傳統上的SQL,需要另外花費時間學習,
透過LINQ/Lambda 利用標準查詢運算子(Standard Query Operators)程式開發上直接使用C# 語言對資料直接做處理(例如:選擇資料來源、篩選資料)
可以利用LINQ方式對資料處理的有:
•SQL Server 資料庫:LINQ to SQL
•XML 文件:LINQ to XML
•ADO.NET Dataset:LINQ to DataSet
•.NET 集合中的資料(例:ArrayList):LINQ to Objects
Lambda
Lmbda 運算式是可表示為委派或編譯成委派之運算式樹狀架構的程式碼,簡化Linq語法,可以搭配Linq使用。
使用 LINQ /Lambda 優缺點:
優點:
-開發人員不需要對SQL語法了解
- 沒有SQL Injection的問題
-INSERT/UPDATE 時不需要逐一列舉欄位名稱、宣告欄位值變數,寫法更簡潔方便
缺點:
-難以應用 SQL 語法專屬特性簡化問題或提升效能
-SQL複雜查詢邏輯轉成單一 LINQ 查詢時,難DEBUG
使用SQL語法優缺點:
優點:
-對於需要邏輯設定較多時,開發工程師可以精準控制執行
-閱讀性較高
缺點:
-有SQL Injection的問題
-INSERT/UPDATE 時要逐一列舉欄位名稱、宣告欄位值變數
SQL 查詢範例
public DataTable GettblPriority(tblPriority tblPriorityQueryModel)
{
using (testEntities db = new testEntities())
{
DataTable dtFunction = new DataTable();
StringBuilder strSql = new StringBuilder();
strSql.Append(@"SELECT
PkID,
OrderNumber,
PartNo,
PurchaseOrderNo,
SupplierName,
Quantity,
CreateDate,
d.companyName
FROM
tblPriority
INNER JOIN tblDemo as d on tblPriority.PkID=d.PK
WHERE 1=1
");
List<SqlParameter> paramLst = new List<SqlParameter>();
//pkID
if (tblPriorityQueryModel != null)
{
if (tblPriorityQueryModel.PkID > 0)
{
strSql.Append(@"AND PkID = @PkID");
paramLst.Add(new SqlParameter("@PkID", tblPriorityQueryModel.PkID));
}
// 製令單號
if (!string.IsNullOrEmpty(tblPriorityQueryModel.OrderNumber))
{
strSql.Append(@"AND OrderNumber = @OrderNumber ");
paramLst.Add(new SqlParameter("@OrderNumber", tblPriorityQueryModel.OrderNumber));
}
//料號
if (!string.IsNullOrEmpty(tblPriorityQueryModel.PartNo))
{
strSql.Append(@"AND PartNo = @PartNo ");
paramLst.Add(new SqlParameter("@PartNo", tblPriorityQueryModel.PartNo));
}
//採購單號
if (!string.IsNullOrEmpty(tblPriorityQueryModel.PurchaseOrderNo))
{
strSql.Append(@"AND PurchaseOrderNo = @PurchaseOrderNo ");
paramLst.Add(new SqlParameter("@PurchaseOrderNo", tblPriorityQueryModel.PurchaseOrderNo));
}
//供應商
if (!string.IsNullOrEmpty(tblPriorityQueryModel.SupplierName))
{
strSql.Append(@"AND SupplierName like '%' + @SupplierName + '%' ");
paramLst.Add(new SqlParameter("@SupplierName", tblPriorityQueryModel.SupplierName));
}
}
// 查詢
dtFunction = SqlQueryForDataTatable(db.Database, strSql.ToString(), paramLst.ToArray());
return dtFunction;
}
}
LINQ 查詢範例
JoinTbl.cs 檔案設定如下
public class JoinTbl
{
public string OrderNumber { get; set; }
public string PartNo { get; set; }
public string companyName { get; set; }
}
List<JoinTbl> joinModel = new List<JoinTbl>();
//linq 查詢語法
var result = (from c in db.tblPriority
join o in db.tblDemo on c.PkID equals o.PK
select new JoinTbl
{
OrderNumber = c.OrderNumber,
PartNo = c.PartNo,
companyName = o.companyName
});
joinModel = result.ToList();
Lambda 查詢範例
//Lambda
var Lambdajoin = db.tblPriority.Join(db.tblDemo, //第一個參數為 要加入的資料來源
p => p.PkID,//主表要join的值
d => d.PK,//次表要join的值
(p, d) => new JoinTbl // (c,s)代表將資料集合起來
{
OrderNumber = p.OrderNumber,
PartNo = p.PartNo,
companyName = d.companyName
});
//採購單號
if (!string.IsNullOrEmpty(tblPriorityModel.PartNo))
{
//查詢條件
Lambdajoin = Lambdajoin.Where(x => x.PartNo == tblPriorityModel.PartNo);
}
//排序
Lambdajoin = Lambdajoin.OrderBy(cs => cs.OrderNumber);
joinModel = Lambdajoin.ToList();
SQL 新增語法範例
public int SavetblPriority(tblPriority tblPriorityINSERTModel)
{
int dttblPriority = 0;
StringBuilder strSql = new StringBuilder();
strSql.Append(@"INSERT INTO tblPriority (OrderNumber, PartNo, PurchaseOrderNo,SupplierName,
Quantity,CreateDate
)
VALUES (@OrderNumber, @PartNo, @PurchaseOrderNo,@SupplierName,
@Quantity,@CreateDate)
");
List<SqlParameter> paramLst = new List<SqlParameter>();
paramLst.Add(new SqlParameter("@OrderNumber", tblPriorityINSERTModel.OrderNumber));
paramLst.Add(new SqlParameter("@PartNo", tblPriorityINSERTModel.PartNo));
paramLst.Add(new SqlParameter("@PurchaseOrderNo", tblPriorityINSERTModel.PurchaseOrderNo));
paramLst.Add(new SqlParameter("@SupplierName", tblPriorityINSERTModel.SupplierName));
paramLst.Add(new SqlParameter("@Quantity", tblPriorityINSERTModel.Quantity));
paramLst.Add(new SqlParameter("@CreateDate", tblPriorityINSERTModel.CreateDate));
dttblPriority = SqlCommand(db.Database, strSql.ToString(), paramLst.ToArray());
return dttblPriority;
}
Lambda 新增語法 範例
public Boolean InstertblPriority(tblPriority tblPriorityINSERTModel)
{
try
{
using (testEntities db = new testEntities())
{
db.tblPriority.Add(tblPriorityInster);
db.SaveChanges();
}
return true;
}
catch (Exception ex)
{
return false;
}
}
Lambda 更新語法範例
public Boolean UpdatatblPriority(tblPriority PostModel)
{
try
{
using (testEntities db = new testEntities())
{
//修改資料,更新的條件會以主鍵為主,所以主鍵不能為null值
db.Entry(PostModel).State = EntityState.Modified;
db.SaveChanges();
}
return true;
}
catch (Exception)
{
return false;
}
}
參考資料來源:
MSDN文件
Language Integrated Query (LINQ)
Lambda 運算式 (C# 程式設計指南)
[ASP.NET][LINQ] 基本LINQ語法介紹
所以什麼是LINQ?
閒聊:用 LINQ 還是自己寫 SQL?
.net – LINQ的优点和缺点(语言集成查询)
Linq Join & Lambda Join