LINQ&Lambda&SQL(基礎篇)

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?

.net – LINQ的优点和缺点(语言集成查询)

Linq Join & Lambda Join