none
Lambda Expression to SQL Update 思路 RRS feed

  • 一般討論

  • 嗨,大家好,

    有一個對舊 DB Table Schema 只適合用 SQL 寫,不適合用 ORM 的專案,

    我想提供 Repository 一些簡單方法,

    其中對於單張 Repository<Table> 要做一些簡單的 Update SQL 的方法,

    我想到用 Lambda Expression to SQL 是可行的,

    (這樣雖然跟寫 SQL 其實差不多,但可以強型別來寫代碼,算是一種享受?)

    請問是否已經有現成 Lambda Expression 轉換為 SQL 與參數的套件,

    不然自幹的話,應該要一段時間這功能才會穩定,

    以下是目前思路的範例寫法,但尚未實作方法:

    			var repo = new Repository<Product>();
    
    			// 單筆更新
    			var customer = new Customer { AddQty = 5 };
    			repo.Update(
    			SET: p => new Product
    			{
    				Qty = p.Qty + customer.AddQty
    			},
    			WHERE: p => p.ProductName == "123" && p.Qty > customer.AddQty);
    
    
    			// 多筆更新
    			var customers = new List<Customer>();
    			repo.Update(
    			SET: (p, c) => new Product
    			{
    				Qty = p.Qty + c.AddQty
    			},
    			WHERE: (p, c) => p.ProductName == "123" && p.Qty > c.AddQty,
    			parms: customers);

    若有其他建議的話,歡迎跟我說,感謝各位大大。


    • 已編輯 503 2016年6月19日 下午 03:24 第二個方法,能直接取代第三個方法
    2016年6月19日 上午 10:12

所有回覆

  • 說真的,你想要用上面的寫法自動轉,可能你寫到一半就投降了。

    因為 SQL 的變化方法很多,你提供給上層用的 API 也不會簡單到哪去,中間的判斷就夠你受的了,這還不包含你的 Lambda Expression 的剖析和轉換。

    你可以先把這個系列文讀完:

    https://blogs.msdn.microsoft.com/mattwar/2009/06/16/building-a-linq-iqueryable-provider-part-xv-iqtoolkit-v0-15/

    全系列有 15 篇文章左右吧,如果你看完後覺得還是想做,那拯救 LINQ 轉 SQL 的重責大任,就交給你了。 


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2016年6月19日 上午 10:24
    版主
  • 感謝小朱提供連結,

    一開始還沒想這麼遠,要實作複雜的功能,還真的有點傷腦筋,

    但如果只是對一 Table Update Set Where 的話,去除複雜的子查詢與 join,

    基本的一元運算式與二元運算式與簡單 SQL 方法應該還是能先做出來,

    主要取代簡易的 Update SQL,真的複雜的應該還是直接寫 SQL 會比較好 Debug 與優化,

    用意比較像 Repository 提供 Update(T) 方法更新單一紀錄,不用在寫簡單的 Update SQL 一樣,

    不過如果有大大知道有現成的套件的話,在麻煩跟我說~ 感謝。

    2016年6月19日 下午 12:33
  • 這裏有不錯的範例可以參考看看:Repositories

    2016年6月20日 上午 06:42
  • 感謝提供連結~

    ASP.NET Boilerplate 專案架構非常值得參考!

    2016年6月20日 下午 03:27
  • Boilerplate 是個不錯的專案,不過和你要的有落差,它用的還是現有的 ORM Framework。

    所以你要先弄清楚你要用的是 "ORM" 還是 "Repository",這兩個是有差 (而且還差很多) 滴...


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2016年6月21日 上午 12:09
    版主
  • 嗯嗯,我有看 Source Code,所以特意指出專案架構值得參考~

    討論點的確是放在 Lambda Expression to SQL,沒有要使用 EF 之類的 ORM Framework。

    2016年6月21日 上午 07:23