<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>.NET(LINQ)</title><link>http://blog.blueshop.com.tw/topcat/category/2356.aspx</link><description>LINQ學習心得分享</description><managingEditor>topcat</managingEditor><dc:language>zh-TW</dc:language><generator>.Text Version 0.95.2004.101</generator><item><dc:creator>topcat</dc:creator><title>透過自訂Function當作LINQ的Where條件(多重條件篩選)範例與動態教學</title><link>http://blog.blueshop.com.tw/topcat/archive/2008/02/22/54378.aspx</link><pubDate>Fri, 22 Feb 2008 14:53:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2008/02/22/54378.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/54378.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2008/02/22/54378.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/54378.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/54378.aspx</trackback:ping><description>&lt;P&gt;以往為了讓使用者篩選資料的時候可以靈活應用，會在畫面上每個條件前面加個CheckBox，讓使用者可以自由勾選要篩選的欄位並設定條件，如下圖：&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://vip2.blueshop.com.tw/topcat/LinqDemo/LinqFunc01.jpg"&gt;&lt;/P&gt;
&lt;P&gt;這樣的方式在以往資料來源是SQL的時候，可以透過判斷式、加上組合SQL字串的方式達到，但是在Linq裡面要怎麼處理呢??&lt;/P&gt;
&lt;P&gt;小喵再練習Linq的過程中，想到了這個問題...剛好&lt;A href="http://www.kangting.tw/" target=_blank&gt;康廷數位&lt;/A&gt;的呂高旭老師MSN過來與小喵聊到要寫LINQ書籍的計畫，小喵於是向呂老師請教了這方面的問題...&lt;/P&gt;
&lt;P&gt;小喵做了一個教學動畫，透過自己寫的一個Function來當作篩選的條件，相關內容請點選以下的超鏈結：&lt;/P&gt;
&lt;P&gt;&lt;A onclick="window.open('http://vip.blueshop.com.tw/topcat/LinqDemo/LINQFun.html');" href="#"&gt;透過自訂Function當作LINQ的Where條件&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;相關的畫面程式碼如下：&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA class=xml style="WIDTH: 689px; HEIGHT: 100px" name=code rows=6 cols=81&gt;        資料夾：&lt;asp:TextBox ID="txtDir" runat="server"&gt;&lt;/asp:TextBox&gt;
        &lt;asp:Button ID="btnGetFiles" runat="server" Text="取得檔案資訊" /&gt;
        &lt;br /&gt;
        訊息：&lt;asp:Label ID="lblMsg" runat="server" Text="" ForeColor="Red" Font-Bold="True"&gt;&lt;/asp:Label&gt;
        &lt;hr /&gt;
        &lt;table&gt;
            &lt;tr&gt;
                &lt;td valign="top"&gt;
                    篩選條件：&lt;br /&gt;
                    &lt;asp:CheckBox ID="chkExten" runat="server" Text="副檔名：" /&gt;
                    &lt;asp:DropDownList ID="ddlExten" runat="server"&gt;
                    &lt;/asp:DropDownList&gt;&lt;br /&gt;
                    &lt;asp:CheckBox ID="chkFileName" runat="server" Text="檔名包含：" /&gt;
                    &lt;asp:TextBox ID="txtFileName" runat="server"&gt;&lt;/asp:TextBox&gt;&lt;br /&gt;
                    &lt;asp:Button ID="btnQry" runat="server" Text="篩選" /&gt;&lt;br /&gt;
                    &lt;asp:Button ID="btnQryFunc" runat="server" Text="透過Function篩選" /&gt;
                    
                &lt;/td&gt;
                &lt;td&gt;
                    &lt;asp:GridView ID="GridView1" runat="server"&gt;
                    &lt;/asp:GridView&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/table&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/54378.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>透過LINQ篩選目錄中的檔案，用GridView顯示篩選結果</title><link>http://blog.blueshop.com.tw/topcat/archive/2008/01/23/54135.aspx</link><pubDate>Wed, 23 Jan 2008 15:29:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2008/01/23/54135.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/54135.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2008/01/23/54135.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/54135.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/54135.aspx</trackback:ping><description>&lt;P&gt;LINQ to Object真是好用，只要能夠把資料放到【物件集合】後，接下來要去下條件篩選，對LINQ來說是輕而易舉的事情。&lt;/P&gt;
&lt;P&gt;這裡就用檔案系統來做個範例&lt;/P&gt;
&lt;P&gt;再以下這篇中，已經提到怎麼用GridView來顯示某資料夾裡面的內容&lt;BR&gt;&lt;A href="http://blog.blueshop.com.tw/topcat/archive/2008/01/23/54129.aspx"&gt;http://blog.blueshop.com.tw/topcat/archive/2008/01/23/54129.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;這裡更將這個應用衍生用LINQ來篩選，我們將會作以下這些事情&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;依照指定的資料夾，撈出資料夾中的檔案資訊，放到ViewState中&lt;/LI&gt;
&lt;LI&gt;透過LINQ撈取指定的副檔名檔案，並顯示在GridView中&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;作法如下：&lt;/P&gt;
&lt;P&gt;首先一樣的安排一下畫面的控制項：&lt;BR&gt;&lt;TEXTAREA class=xml style="WIDTH: 673px; HEIGHT: 100px" name=code rows=6 cols=79&gt;    資料夾：&amp;lt;asp:TextBox ID="txtDir" runat="server"&amp;gt;&amp;lt;/asp:TextBox&amp;gt;
        &amp;lt;asp:Button ID="btnGetAllData" runat="server" Text="讀取資料夾檔案" /&amp;gt;
        &amp;lt;br /&amp;gt;
        &amp;lt;div id="divC" runat="server"&amp;gt;
            附檔名：
            &amp;lt;asp:TextBox ID="txtCData" runat="server"&amp;gt;&amp;lt;/asp:TextBox&amp;gt;
            &amp;lt;asp:Button ID="btnQry2" runat="server" Text="篩選" /&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;br /&amp;gt;
        &amp;lt;asp:GridView ID="GridView1" runat="server"&amp;gt;
        &amp;lt;/asp:GridView&amp;gt;&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;接著在CodeFile中的程式，先處理會用到的Imports，這邊等下會用到LINQ，不要忘了這個重要的System.Linq&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA class=vb style="WIDTH: 669px; HEIGHT: 100px" name=code rows=6 cols=79&gt;Imports System.IO
Imports System.Collections.Generic
Imports System.Linq&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;再來宣告一個變數用來存放資料夾中的檔案資訊&lt;BR&gt;&lt;TEXTAREA class=vb style="WIDTH: 669px; HEIGHT: 100px" name=code rows=6 cols=79&gt;Dim myFiles As List(Of FileInfo)&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;在PageLoad的時候，先從ViewState中取回myFiles，如果一開始沒有東西，就New一下產生執行個體&lt;BR&gt;&lt;TEXTAREA class=vb style="WIDTH: 682px; HEIGHT: 100px" name=code rows=6 cols=80&gt;    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        myFiles = ViewState("myFiles")
        If myFiles Is Nothing Then
            myFiles = New List(Of FileInfo)
        End If
    End Sub&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;接著處理取得資料夾內所有檔案資訊並放入myFiles中&lt;BR&gt;&lt;TEXTAREA class=vb style="WIDTH: 681px; HEIGHT: 100px" name=code rows=6 cols=80&gt;    Protected Sub btnGetAllData_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGetAllData.Click
        Dim tFile As FileInfo
        myFiles.Clear()

        For Each fn As String In My.Computer.FileSystem.GetFiles(Me.txtDir.Text)
            tFile = My.Computer.FileSystem.GetFileInfo(fn)
            myFiles.Add(tFile)
        Next

        ViewState("myFiles") = myFiles
        Me.GridView1.DataSource = myFiles
        Me.GridView1.DataBind()
    End Sub
&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;最後就是從這些資料中，透過LINQ來篩選資料&lt;BR&gt;&lt;TEXTAREA class=vb style="WIDTH: 678px; HEIGHT: 100px" name=code rows=6 cols=80&gt;    Protected Sub btnQry2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnQry2.Click
        Dim o = From f In myFiles _
                Where f.Extension Like "*" &amp;amp; Me.txtCData.Text &amp;amp; "*" _
                Select f
        Me.GridView1.DataSource = o
        Me.DataBind()
    End Sub&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;從最後的部分，使用LINQ來篩選資料真是輕鬆愉快啊，只要設定好Where的條件就可以了^_^&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/54135.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>關於LINQ的一些想法</title><link>http://blog.blueshop.com.tw/topcat/archive/2008/01/23/54133.aspx</link><pubDate>Wed, 23 Jan 2008 13:33:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2008/01/23/54133.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/54133.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2008/01/23/54133.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/54133.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/54133.aspx</trackback:ping><description>&lt;P&gt;這陣子小小測試了一下LINQ，包括了LINQ to Object&amp;nbsp;與&amp;nbsp;LINQ to SQL，有一些小小的個人心得提供大家分享(以下的分享純粹個人的觀感，不見得全是正確的)&lt;/P&gt;
&lt;P&gt;1.LINQ to Object：小喵覺得LINQ裡面最重要的就是LINQ to Object了，觀察LINQ to SQL的試用過程中，也是透過工具把現有SQL的資料表，轉成物件。然後再透過LINQ的方式做存取。&lt;/P&gt;
&lt;P&gt;2.物件導向觀念：以往使用控制項，還可以不太管是否用物件，但是用了LINQ to Object後，既然他的運作主要在【物件集合】的運用，那麼對於完全不懂物件的人，應該會不太容易了解LINQ。事實上小喵從中更體驗到，整個.NET就是物件架構起來的。因此能夠有物件的概念，對於學習LINQ會有很大的幫助。&lt;/P&gt;
&lt;P&gt;3.LINQ使用的衍生：LINQ的處理既然主要是對於【物件集合】。因此可以想像得到，如果將所要的資料轉為用物件的方式存放後，就可以用得上LINQ。因此我可以做類似這樣的運用【資料夾的檔案資訊與資料庫中資料表的資訊做JOIN處理】。這樣提供了資料使用的無限可能。未來需要處理的資料只需要先轉成【物件集合】，接著用LINQ這樣就能夠快速的應用在各式不同的資料了(檔案系統、SQL資料庫、FoxPro、XML、Informix、....等)&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/54133.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>LINQ to Object初體驗(使用物件取代二維陣列作資料篩選)</title><link>http://blog.blueshop.com.tw/topcat/archive/2007/12/07/53579.aspx</link><pubDate>Fri, 07 Dec 2007 17:00:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2007/12/07/53579.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/53579.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2007/12/07/53579.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/53579.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/53579.aspx</trackback:ping><description>&lt;P&gt;VS2008裡面有個神奇的東西，稱之為LINQ，可以透過相同的語法方式來處理各式各樣的資料(SQL,XML,Object,...)，小喵此次初體驗感受一下這個東西，真的很好用，初體驗來做個簡單的測試，請看小喵娓娓道來&lt;/P&gt;
&lt;P&gt;先來看一張LINQ的架構圖(資料來源：曹祖聖老師在TechEd2007的簡報)&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blog.blueshop.com.tw/images/blog_blueshop_com_tw/topcat/590/o_LINQ01.jpg" target=_blank&gt;&lt;IMG src="/images/blog_blueshop_com_tw/topcat/590/o_LINQ01.jpg" width="60%"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;要看完整的請點選上面的圖檔，從這張圖來看LINQ可以用來取得相當多的資料，而只要資料能夠用程Object的形式，就能夠透過LINQ來存取&lt;/P&gt;
&lt;P&gt;接著就開始這次的初體驗&lt;/P&gt;
&lt;P&gt;先說明一下小喵要做的：小喵弄個座位表格，分別有--SeatId(座位代號),SeatName(座位名稱)&lt;BR&gt;然後產生測試資料200個座位資料，SeatName(座位名稱)用亂數產生a-z的字母加上SeatId當作是座位名稱，最後用個介面來測試使用LINQ篩選資料(找字頭相同的)&lt;/P&gt;
&lt;P&gt;這樣的題目以前小喵在ASP都是用二維陣列來做，在.NET裡面則是可以用物件的方式取代二為陣列&lt;/P&gt;
&lt;P&gt;先建立座位的物件如下：&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA class=vb style="WIDTH: 681px; HEIGHT: 100px" name=code rows=6 cols=80&gt;&amp;lt;Serializable()&amp;gt; _
Public Class Seat
    Private m_SeatNum As Integer
    Private m_SeatName As String

    Public Property SeatNum() As Integer
        Get
            Return m_SeatNum
        End Get
        Set(ByVal value As Integer)
            m_SeatNum = value
        End Set
    End Property
    Public Property SeatName() As String
        Get
            Return m_SeatName
        End Get
        Set(ByVal value As String)
            m_SeatName = value
        End Set
    End Property
End Class&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;接著設計畫面如下&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA class=xml style="WIDTH: 681px; HEIGHT: 100px" name=code rows=6 cols=80&gt;        &amp;lt;table class="style1"&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;td&amp;gt;
                    &amp;lt;asp:Button ID="btnGen" runat="server" Text="產生座位資料" /&amp;gt;
                    &amp;lt;asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" 
                        GridLines="None"&amp;gt;
                        &amp;lt;FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /&amp;gt;
                        &amp;lt;RowStyle BackColor="#EFF3FB" /&amp;gt;
                        &amp;lt;PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" /&amp;gt;
                        &amp;lt;SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" /&amp;gt;
                        &amp;lt;HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /&amp;gt;
                        &amp;lt;EditRowStyle BackColor="#2461BF" /&amp;gt;
                        &amp;lt;AlternatingRowStyle BackColor="White" /&amp;gt;
                    &amp;lt;/asp:GridView&amp;gt;
                &amp;lt;/td&amp;gt;
                &amp;lt;td valign="top"&amp;gt;
                    &amp;lt;asp:TextBox ID="TextBox1" runat="server"&amp;gt;&amp;lt;/asp:TextBox&amp;gt;
                    &amp;lt;asp:Button ID="btnSift" runat="server" Text="篩選座位名稱" /&amp;gt;
                    &amp;lt;asp:GridView ID="GridView2" runat="server" CellPadding="4" ForeColor="#333333" 
                        GridLines="None"&amp;gt;
                        &amp;lt;FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /&amp;gt;
                        &amp;lt;RowStyle BackColor="#EFF3FB" /&amp;gt;
                        &amp;lt;PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" /&amp;gt;
                        &amp;lt;SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" /&amp;gt;
                        &amp;lt;HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /&amp;gt;
                        &amp;lt;EditRowStyle BackColor="#2461BF" /&amp;gt;
                        &amp;lt;AlternatingRowStyle BackColor="White" /&amp;gt;
                    &amp;lt;/asp:GridView&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
        &amp;lt;/table&amp;gt;&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;產生的資料放在GridView1,篩選後的資料放在GridView2&lt;/P&gt;
&lt;P&gt;接著撰寫產生資料的部分&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA class=vb style="WIDTH: 669px; HEIGHT: 100px" name=code rows=6 cols=79&gt;    Protected Sub btnGen_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGen.Click
        Dim y As Integer
        Dim s As Seat
        mySeats.Clear()
        For y = 1 To 200
            s = New Seat
            s.SeatNum = y
            s.SeatName = GetRndChr() + "-" + y.ToString
            mySeats.Add(s)
        Next
        ViewState("mySeats") = mySeats

        Me.GridView1.DataSource = mySeats
        Me.GridView1.DataBind()
    End Sub
    Protected Function GetRndChr() As String
        Dim i As Integer = 26
        Randomize()
        Dim tmpI As Integer = i * Rnd() + 1 + 96
        Return Chr(tmpI)
    End Function&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;然後就是我們的重點來了，在這些資料中，想要找SeatName(座位名稱)a開頭的資料，以前小喵可能會用個迴圈逐筆查，但是有了LINQ，就可以寫成以下這樣&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA class=vb style="WIDTH: 682px; HEIGHT: 100px" name=code rows=6 cols=80&gt;    Protected Sub btnSift_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSift.Click
        Dim Qry As Object = From ss In mySeats _
                            Where ss.SeatName Like Me.TextBox1.Text + "*" _
                            Select ss
        Me.GridView2.DataSource = Qry
        Me.GridView2.DataBind()

    End Sub&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;各位可以發現，用這樣超短的程式碼就能夠做到篩選。真是太好了&lt;/P&gt;
&lt;P&gt;熟悉T-SQL的朋友，您接著就可以想像以前T-SQL裡面的Grou By,Distinct,Order By等等都可以再物件裡面玩，甚至可以透過JOIN，把不同的物件資料作關聯之後來取資料。真是神奇啊。&lt;/P&gt;
&lt;P&gt;這次的初體驗只是約略的感受一下LINQ的威力，此次的例子只是兩個欄位，一個條件的篩選，各位可以試想一下，如果應用在很多欄位，並且結合其他的資料(LINQ可以使用JOIN)並且使用多重條件的篩選，那麼可以節省多少的程式碼就能夠達到相同的目的。未來有其他的測試再與大家分享。&lt;/P&gt;
&lt;P&gt;^_^&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/53579.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>