Browse by Tags

小技巧-當集合型別不支援 LINQ 擴充方法
用慣 LINQ 後不太能忍受回頭用 foreach 處理集合物件,List<T>、IEnumerable<T> 及物件陣列可直接 Where()、Select() ,基本上涵蓋大部分應用情境,但有些時候還是會遇到一些不支援 LINQ 擴充方法的集合物件。這篇筆記將介紹透過簡單轉換讓集合支援 LINQ 的小技巧。(別像我以前傻傻先 var list = new List<T> 再 foreach 跑 list.Add(…) ) 舉兩個我遇過的例子。 有字串 A12...
Posted 14 September 2017 11:40 PMJeffrey | with no comments 6,764
Filed under:
閒聊:用 LINQ 還是自己寫 SQL?
前陣子在網路看到「該靠 EF(LINQ)還是自幹 SQL 語法(甚至一律轉成 SP)」 的討論,我的「個人偏好」挺明確-CRUD 可靠 EF/ORM 省工,複雜查詢或操作則走 Dapper 自己寫 SQL。不過它只算是「偏好」,其效益因客觀條件劇烈變動,若無視開發者背景、人力資源配置、系統需求等各種因素,無限期支持 OOO 一定比 XXX 好,肯定會在特定情境踩坑。既然沒有一體適用的「建議」,我就只從開發老人的角度聊聊決策理由及優劣分析,不陷入追求「最佳解」的迷思。(充其量只會有符合某種情境的「最適解...
Posted 08 May 2017 07:29 AMJeffrey | 7 comment(s) 15,092
Filed under: ,
利用LINQ GroupBy快速分組歸類
分享最近學到的LINQ小技巧一則。有時我們會需求將資料物件分組擺放,方便後續查詢處理,例如:將散亂的銷售資料依客戶分群,同一客戶的所有資料變成一個List<T>。 過去面對這種問題,我慣用的做法先定義一個Dictionary<string, List<T>>,使用 foreach 逐筆抓取來源資料,從中取出鍵值(例如:客戶編號),先檢查鍵值是否已存在於Dictionary,若無則新増一筆並建立空的List<T>,確保Dictionary有該鍵值專屬List<T>...
Posted 24 August 2016 07:59 AMJeffrey | 11 comment(s) 10,340
Filed under:
LINQ寫法:類SQL查詢語法 vs 方法串接
前陣子跟同事討論到LINQ查詢寫法。 記得在LINQ剛推出時以「可以在C#裡寫SQL語法查資料」為號召,範例裡常看到這種長得有點像SQL語法的 LINQ查詢運算式 (LINQ Query Expression,我習慣叫它「類SQL查詢語法」): IEnumerable< int > scoreQuery = //query variable from score in scores //required where score > 80 // optional orderby score...
Posted 05 February 2016 09:49 AMJeffrey | 8 comment(s) 15,604
Filed under:
組裝動態LINQ條件的利器-LINQKit
昨天提到實務上查詢條件多半由使用者動態決定,往往得靠SqlQuery或Dapper配合 WHERE條件字串動態組裝 搞定。(提醒:SQL語法可以用串接的,使用者輸入內容務必使用參數嵌入)但如此就得放棄LINQ .Where()的強型別優點。介紹一個好物,讓你可以兩者兼顧- LINQKit 。 老樣子,用NuGet就可安裝,查詢關鍵字請填"LinqKit": 最新版的LINQKit需要EntityFramework 6.1.3以上,但依其運作原理,EF5應該也適用,等遇到再說。...
Posted 23 October 2015 07:50 AMJeffrey | 6 comment(s) 12,576
Filed under: ,
【茶包射手日記】LINQ Contains查詢引發ORA-01425錯誤
網友報案:使用 ODAC112030 與 Visual Studio 建立 Entity Framework Model ,在 C# 使用 LINQ 語法.Where(o => o.ColName.Contains(someVar)),被轉換成以下SQL語法: WHERE ("Extend1"."FOO" LIKE :p__linq__0 ESCAPE '\') 送到Oracle 9i執行(是的,侏儸紀時代的Oracle 9),冒出ORA...
Posted 09 May 2015 07:55 AMJeffrey | with no comments 3,973
Filed under: ,
善用LINQ Except比對產生資料庫增刪指令
手邊有個系統包含轄區概念,每隔一陣子就會微調,把主管A的管區1移給主管B,主管B的管區2移給主管C... 玩一場大風吹。由於提供資料直接交換管道,我們只能依使用者提供的文字檔更新資料庫(實際上使用者提供的檔案格式沒標準化,有時是Excel、有時是PDF,順便大推 Word 2013直接開啟PDF編輯 的功能,很神!)。因此我的做法是將資料庫現有設定與使用者提供的新設定都轉成格式一致的文字,再設法比對二者差異產生DELETE、UPDATE、INSERT指令(全部刪除再新增是種簡便做法,但缺點時無法產生異動報表供使用者確認...
Posted 10 July 2014 07:19 AMJeffrey | 1 comment(s) 9,239
Filed under:
短小精悍的.NET ORM神器 -- Dapper
應該有很多人像我一樣,對LINQ的依賴已經到達 "LINQ or Die!"(不LINQ,吾寧死) 的地步,到了需要存取DB的場合,打死也不想再走ADO.NET + DataTable、DataRow的回頭路。不過,在專案引用EntityFramework或其他ORM解決方案(NHibernation、SubSonic...),固然嚴謹紮實,卻也多出額外工作--要依照Schema在專案定義Entity物件、資料庫變更時要記得同步更新Entity定義,遇到多TABLE JOIN查詢得另外宣告自訂類別承接查詢結果...
Posted 15 May 2014 06:30 AMJeffrey | 12 comment(s) 72,204
Filed under: ,
關於IQueryable<T>特性的小實驗
ASP.NET Web API支援OData,可以藉由URL加註$filter、$orderby、$skip、$top參數,對資料進行條件篩選、排序、分頁等加工(關於ASP.NET Web API OData特性,可參見KKBruce的 文章 )。而要啟用OData,有項重要前題是回傳資料型別必須為IQueryable<T>,而非一般LINQ常用的IEnumerable<T>。 對於List<T>、T[]等保存在記憶體的資料結構,傳回IQueryable<T>充其量只是要多一層...
5碼郵遞區號轉3碼JSON,一場LINQ花式操槍表演
一開始,我只是為了某個Knockout程式範例,打算花十分鐘把 3+2郵遞區號XML轉檔程式 稍做整理,改寫成輸出3碼資料JSON而已,沒想到魔鬼都在細節裡,資料裡幾則特殊案例,搞得我手忙腳亂汗水直滴,最後花了一個半小時才達成目的,驗證傳說中"工程師預估的時程 根本是放屁 只能純參考"所言不虛... 故事是這樣的,中華郵政網站可以 下載 3碼郵遞區號表(Text、Word及Excel格式)及3+2碼郵遞區號資料檔(Text, Excel, XML),要用程式處理,XML顯然是較佳的資料來源...
Posted 02 September 2012 03:57 PMJeffrey | 5 comment(s) 15,375
Filed under: ,
無尾差分贓法崩壞記
自從經前輩醍糊灌頂,學會"未分配數量 * (權重 / 尚未分配權重總和)"一次到位的 無尾差分贓演算法 後,開心地用了好幾年,後來更演化出 LINQ進化版 ,從此在.NET中要分贓算錢如虎添翼! 幾年下來,未曾得接獲於此演算法的缺點回饋,於是它在我心中一直維持完美無瑕的女神形象! 直到最近一個極端例子讓我的女神當場崩壞,猶如無意瞥見林志玲摳腳挖鼻孔般讓人心碎與震撼~~ 用一個例子重現問題: 巴菲特跟10個散戶合資買基金,散戶每人出100元,巴菲特出資100萬,基金單位淨值9.5元...
Posted 23 February 2012 08:56 PMJeffrey | with no comments 8,843
Filed under: ,
當心LINQ搜尋的效能陷阱
對於長年與資料庫、SQL語法打交道的開發者來說,LINQ語法有無比的親切感! 當要在List<SomeClass>集合中找尋特定物件時,寫成    form o in SomeList where o.Col1 == "A" && o.Col2 == "B" select o 是再自然也不過的事。乍看之下,反正List<SomeClass>已被存在記憶體,無須顧忌反覆查詢資料庫所產生的連線成本,而where條件比對又十分直覺易懂...
Posted 20 October 2011 12:55 AMJeffrey | 11 comment(s) 30,249
Filed under: ,
CODE-分贓程式的寫法(LINQ進化版)
很久前曾寫過一篇範例,介紹將數字金額依不同權重拆成多筆的 分贓程式 寫法,最近專案又再度陷入算錢的漩渦,但局面有點改變。近一兩年被.NET 3.5/.NET 4寵壞了,已經有點"不用LINQ不會寫Code"的傾向,因此現在寫的帳務程式,就大量引用了List<SomeObject>的技巧處理資料。舉例來說,拆帳結果被裝在類似List<ResultObject>的IEnumerable裡,要做到依權重分攤,最直覺的寫法是跑個迴圈套用原本的分贓演算法,看起來就能輕鬆搞定...
Posted 29 June 2011 06:18 AMJeffrey | 1 comment(s) 9,911
Filed under: , ,
Class Library使用DataContext時的連線字串設定問題
在Visual Studio中使用LINQ to SQL或EF時,拖拉資料庫產生Entity類別,VS會幫忙打理儲存連線字串。在小型ASP.NET專案裡,*.dbml被直接加入網站專案,VS就順理成章地在web.config <connectionStrings />中加入連線字串,實際上線時,將web.config裡的設定改連正式資料庫即可。 但當專案規模變大,我們常會將資料存取相關的程式移到獨立的DAL專案(Class Library),因此*.dbml / *.edmx等也被歸在此專案中...
Posted 22 September 2010 07:29 AMJeffrey | 5 comment(s) 10,879
Filed under: ,
MEMO-LINQ DataContext對Primary Key相同物件的處理原則
今天在寫程式時,發現LINQ to SQL在管理物件上的特殊規則,做個筆記。 假設我們有一個Member資料表如下: 有一段程式,其中很取巧的用Member去承接 ExecuteQuery 的執行結果,前後取得四顆物件,放入一個List中: (在我的實際案例中,是SELECT另一個Table的不同欄位組裝出與Member欄位相同的結果,此處為求簡化,採SELECT '...' AS FieldName的方式模擬) protected void Page_Load( object sender...
Posted 13 August 2010 10:18 PMJeffrey | 4 comment(s) 6,561
Filed under:
更多文章 下一頁 »

搜尋

Go

<November 2017>
SunMonTueWedThuFriSat
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication