顯示具有 LINQ 標籤的文章。 顯示所有文章
顯示具有 LINQ 標籤的文章。 顯示所有文章

KKBruce的2016年軟體(開發)工具大補帖

KKBruce的2016年軟體(開發)工具大補帖

Microsoft Edge無法開啟此應用程式
相片無法開啟此應用程式
應用程式無法啟動,因為期試用授權已到期。

因為不知名原因,電腦 Windows 10 所有原生 App 全部無法使用(如上圖),網路上有放著放著就會自己好的說法,我放了二週,重開了 N 次,還是一樣,只好選擇進行 Re-Install OS。現在重灌 Windows 10 + 安裝 Driver (少數) + Windows 10 App 還原,整體時間和以前相比,時間成本真的是大大減少許多,而且已經還原 5 成以上作業的能力了。現在反而是非 Windows App 的軟體,下載安裝設定花的時間多很多。很久以前從 Scott Hanselman 的 Blog 學習到整理軟體清單(我2011年整理)這件事,當時從 Scott Hanselman 的清單挖到不少寶,有些現在還使用。時過境遷,在下載(找)軟體時,突然回想起軟體清單這件事,就順手把目前有在使用的軟體重新整理一下,就當成2016年版軟體(開發)工具清單。

好軟體需要你我支持

以下同時出現 free, pay 代表有測試版(或免費版)可下載使用,通常是功能限制。沒註明的通常是免費的。

身為一位軟體開發人員,我一直推廣:在個人付擔的起的情況下,不要當一位只願意自己喝星巴克而不願意買軟體的人。絕大部份的軟體都不貴,如果真的對你有幫助,你需要天天喝咖啡,就不能一下這位寫出好用軟體的人(或公司)嗎?當然,那種數百美金以上的事,就看你怎麼找到痛點來介紹與推廣給公司,絕不是(抱怨)不可能,只是那痛點是否被你找到。

LINQ Insight - 整合Visual Studio的LINQ分析工具

LINQ Insight - 整合Visual Studio的LINQ測試利器

LINQ Insight是一套有別於LINQPad的產品,LINQPad雖然一開始是以LINQ為出發點,但發展到最後已經算是一個簡化版的編輯器環境。而LINQ Insight是一套專注在Visual Studio與LINQ的產品,它與LINQPad有幾項差異:

  • LINQ Insight與Visual Studio 2010/2012/2013整合。(LINQPad是獨立執行)
  • LINQ Insight的一大特色是,直接在Visual Studio編輯器裡執行你所撰寫好的LINQ(不用啟動專案哦)並取回結果分析。
  • LINQ Insight在有LINQ含參數的部分,也非常容易測試,不用特別進行事前準備。(後面會有範例)
  • LINQ Insight會自動偵測目前專案裡的連線字串(ADO.NET / EDMX)並使用。(LINQ需額外設置)
  • LINQ Insight支援更多元的LINQ Provider。
  • LINQ Insight特有ORM Profiler

以下以一個ASP.NET MVC 5專案與Northwind資料庫產生的ProductsController來說明各項特性。

利用lprun.exe把.linq當command-line的執行檔

利用lprun.exe把.linq當command-line的執行檔

以前一般情況下會介紹LINQPad是因為要寫LINQ,但現在LINQPad已經是除了Visual Studio寫測試程式第二選擇。但有個問題,這支測試程式剛好就是一個command-line(命令提示字元)的專案程式,那麼可不可以直接執行寫好的*.linq檔案,而不是「開Visual Studio,開新專案,"Copy & Paste",compiler ...」。這需求lprun聽到了。

lprun.exe使用簡介

lprun.exe使用方式很簡單,只需要把你寫好的*.linq指定給他,它會動態幫你編譯並執行。

LINQPadRunner

LINQPadRunner以前是個github專案,後來被LINQPad作者直接包進安裝檔之中,如果你的LINQPad一直是採用Update方式,可能會沒有lprun.exe,只需要重新安全最新安裝檔或獨立執行檔,其中都已經包含lprun.exe執行檔。

lprun.exe使用範例

首先來個Hello world:

   void Main()
   {
    Console.WriteLine ("Hello world, LINQ run-time.");
   }
  

將*.linq儲存,利用lprun.exe來執行:

LINQ Dynamic Query

無意中看到關於LINQ動態查詢的文章:Dynamic LINQ LibraryDynamic LINQ (Part 1: Using the LINQ Dynamic Query Library)

它提到LINQ在使用動態查詢時一些狀況,例如,當我們在 Northwind 的 Products 依 CategoryId = 5 來進行各種條件的查詢時,程式會變的很麻煩。而且重點在,如果需求條件改變時,你就必須重新改寫一次程式碼,這樣很不方便。

最後它提出一個好用的解決辦法,而且此辦法在你安裝Visual Studio時就已經送給你了。它利用Visual Studio裡的VB / C#範例程式碼裡的一支程式來擴充LINQ。

VB / C# 範例路徑:C:\Program Files (x86)\Microsoft Visual Studio 10.0\Samples\1028 (Win7 x64) 之下,有VC2010Samples.zip及VBSamples.zip。我解開VBSamples.zip後,找到 *\VB Samples\Language Samples\LINQ Samples\DynamicQuery,以可以找到這支Dynamic.vb範例程式。

你直接引用到Visual Basic專案會有問題,我修正內容:



下載後直接引用即可擴充LINQ的功能。在 *\VB Samples\Language Samples\LINQ Samples\DynamicQuery\Documentation 下有一份 Dynamic Expression API.htm,如果你聽要進深入了解解使用Dynamic Query LINQ,建議細讀之。

Tools -- LINQPad雲端版

LINQ是從.NET Framework 3.5所提的一個存取資料庫的新技術,而且以非常快速的速度走紅,走紅自有它的道理。不過,你在學習LINQ的過程式中一定會有Debug的需求,LINQ到底轉換成什麼T-SQL?但在如Visual Studio 2010裡,也很難Debug,暗黑執行緒有寫過一篇「在ASP.NET中觀察LINQ to SQL所產生的T-SQL語法」,但每次都要重新寫那些Code然後執行,不太可能。

那學習LINQ的人又一定聽過或使用過超強的LINQPad工具,它就是解決你在學習LINQ上的好工具,直接連線到資料庫,然後測試語法,即時查詢LINQ所產生的T-SQL…都是Visual Studio裡所欠缺的。

LINQPad軟體小小的,不管你是要安裝或免安裝版本,它都有提供,而且現在更提供LINQPad雲端版,目前只提供Google Chrome版本,連線後必須下載一個RoozzSetup.exe程式,安裝後,剛才的「LINQPad雲端版」就會跑出與軟體版一模一樣的UI畫面,執行起來效果也不差,真的是太強了。

重點是


雖後是雲端版,但只要資料庫認證資料正確,一切連線都是沒有問題的但也發現一個小問題,它會儲存你的狀態資料,所以像資料庫連線等…訊息,記得,在公用、非個人電腦上,使用完要記得刪除。

ps.. 「LINQPad雲端版」是我自己稱呼的。^_^
ps.. 我在Mozilla Firefox執行也是正常的,但IE就會提示未支援。

Reference:

Visual Studio - Visual Basic & LINQ Samples

Visual Studio with Visual Basic Samples



如果你有安裝
  • Visual Studio 2008:
    "C:\Program Files\Microsoft Visual Studio 9.0\Samples"之下有三個zip檔,一個是VBSamples.zip、CSharpSamples.zip、AllVCLanguageSamples.zip,裡面有許多範例,是學習不可錯過的好教材。或是可以從:Visual Basic 2008 Samples下載。
  • Visual Studio 2010:
    "C:\Program Files\Microsoft Visual Studio 10.0\Samples"一樣可以找到相關範例檔,或是可以從:Visual Basic 2010 Samples下載。

Visual Basic with LINQ



  • 如果你是學Visual Basic的人,一定會發現,市面上用Visual Basic在寫LINQ方面書或資料很少,只能說整個市場的大方向為"C#",如果你要用Visual Basic寫LINQ,那最好的資源來源還是msdn,msdn不會有大小眼,有C#就有Visual Basic版本。:Visual Basic 中的 LINQ
  • 多看多參考別人的Code也是不錯的學習方向: LINQ範例
  • 101 Visual Basic LINQ範例
  • 如果你英文及英文聽力不錯,那可以參考:Visual Basic Videos(linq)

一起加油!

SQL語法的不方便性

前端網頁與後端資料庫溝通,不外乎就是SQL語法,以前就一直覺得為什麼SQL語法設計的那麼差,沒錯,一點都沒有人性化在裡面,一看就知道是工程師計設的,尤其是看過及學過LINQ後,感覺才整個對了。

如果你使用SSMS管理工具來下SQL語法,它提供類似VS開發工具的提示功能,但你會發現如果你不先下「from語法」,那「select語法」或「條件語法」下起來會困難重重,尤其是select_list(欄位)很多,那可是會瘋了。

所以我個人習慣是這樣來下SQL語法:

select *
from customers

等下完from之後,再回去把「*」修改成我要的資料,然後再去下其他where條件等。我是學ASP.NET所以當我看到LINQ之後,非常高興,由from開始,由select結束。

你不先知道從那裡來(from),怎麼可能就知道會有什麼資料(select)?雖然常說,資訊科技一日千里,但回頭看看,還是有很多很慢的地方。大學第一次學SQL Server到現在,SQL語法都已經出來多久了,都沒有人想過去把它改人性一點。只是把語法上下換個位置,很難嗎?

LINQ真的是個好東西,我真的認為可以推廣到其他程式語言裡面,讓開發可以更快樂點,更人性點,不要每天看一堆寫一堆不人性的東西,都快變科學怪人了。

LINQ之延遲查詢與立即查詢

LINQ全稱是「Language-Integrated Query」。如果你想要使用或學習LINQ,那你必須安裝.NET Framework 3.5以上,才有辦法使用。

在使用LINQ時有一地方需要特別小心,就是LINQ在「反應」的時間點。LINQ本身預設為「延遲查詢」。什麼是延遲查詢?我這樣說好了,我們寫程式,預設是從上到下,從右到左執行,也就是執行一行就有一行的效果,例如:「Dim intStu = New Integer() {...} 」當complier執行到這一行,這一行中的intStu馬上就產生為數值陣列,這樣的執行模式稱「立即執行」。

但延遲查詢剛好相反,也就是說,就算complier已經執行過這一段程式,但在沒有其他程式使用到之前,它不會產生任何效果

以下我們來看實際的例子,Default.asp中Page_Load事件:

'Implicit
Dim intStu = New Integer() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

'LINQ,選擇「偶數」
Dim even = From n In intStu Where n Mod 2 = 0 Select n

Response.Write("LINQ 第一次:<br />")
For Each n In even
 Response.Write(n & "<br />")
Next

'改變陣列值
intStu(0) = 200

Response.Write("LINQ 第二次:<br />")
For Each n In even
 Response.Write(n & "<br />")
Next


執行後的結果會如下:

LINQ 第一次:
2
4
6
8
10
LINQ 第二次:
200 '這裡是重點
2
4
6
8
10


請注意第二次中的第一個結果。我們在執行完LINQ後,程式並沒有馬上產生作用,而是等到有人使用時(For Each n In even),才會去執行。所以在我把陣列的值(intStu(0))做改變後,再去執行第二次的For Each語法時,第二次的For Each會去觸發第二次的LINQ查詢,而LINQ再去讀取已經被修改過的陣列,所以造成第二次第一筆值為200

那如果我今天是希望LINQ查詢的結果是固定的,也就是說,不管我事後如何修改陣列值,事後的For Each結果都是一樣的,那你就必須讓LINQ查詢當下要立即執行。立即執行LINQ也很簡單,可以使用ToArray()ToList()方法來強制立即執行。

'LINQ,選擇「偶數」
'使用ToArray或ToList讓LINQ立即執行
'Dim even = (From n In intStu Where n Mod 2 = 0 Select n).ToList
Dim even = (From n In intStu Where n Mod 2 = 0 Select n).ToArray


執行結果,你會看到第一次與第二次完全一模一樣,第二次不再受陣列改變的影響,也就是說,使用使用ToArray或ToList方法後,LINQ語法已經立即產生作用,而第一次與第二次For Each只是將even變數值讀出,而不是去觸發LINQ查詢。

這一點差異是我們在使用LINQ時要小心的地方,不然程式怎麼看都對,邏輯上下右左也查不出所以然,為什麼執行出來的結果永遠不是我們想要的,記得「LINQ預設是延遲執行」。