黄忠成

風雪之閣 - i live,so i writing

code6421ID:Code6421
146010次访问,排名502好友0人,关注者19
Code6421的文章
原创 94 篇
翻译 0 篇
转载 0 篇
评论 206 篇
Code6421的公告
關於我:

黃忠成

  • 資深.NET 技術顧問
  • Run! PC 雜誌專欄作者
  • 程序員雜誌文章作者
  • PC Magazine 雜誌專欄作者
  • MSDN 專欄作者
  • MSDN 特約專屬講師
  • Microsoft .NET專屬講師
  • 台積電(TSMC) Visual Studio(VB.NET) 講師 ( 5/12 ~ 5/19)
  • 台灣微軟最有價值專家(MVP 2008)


  • 批評,指教,鼓勵, 請 寫信給我
    轉載文章請使用連結模式,
    請勿整篇Copy! 謝謝!


    我所提供的教育訓練:

    Windows Forms
    ASP.NET 2.0
    如有課程需要,請與我聯絡!

  • 我的著作:

  • 最近评论
    inelm:great
    blackapple2006:很好 支持
    Will 保哥:非常棒的作法! ^_^
    pjhakka:您好~我利用您提供的方法去加入System.Core到vb.net2005,能加入參考,但不能執行Linq的工作?
    c#.net 2005我測試過可以跑,是只有vb 不能用這個方法嗎?
    TIANSHANREN:标榜顾问的人有多少真正懂技术的???无耻者居多吧!!
    文章分类
    收藏
      相册
      风雪之阁
      朋友
      LOLOTA
      Moli
      Will 保哥
      匡正
      小朱
      董大偉
      賴榮樞
      存档
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 當VS2005 遇上 LINQ收藏

      新一篇: LINQ to SQL 中可以使用的LINQ函式 | 旧一篇: Effective Using LINQ To SQL (1) - 分頁技巧

       
      VS2005 遇上 LINQ
       
      /黃忠成
       
       【極意之道-次世代 .NET Framework 3.5 資料庫開發聖典】(好長的書名,我該取個匿稱嗎?哈)一書第三章中,有下面這段敘述:
      任何支援.NET Framework 2.0的程式語言都能夠叫用LINQ所提供的查詢函式,也就是說能使用C# 2.0來呼叫LINQ Framework
      書中列出一小段程式碼,證明事實上只要是C# 2.0,就能夠使用LINQ所提供的查詢函式,前提是電腦中必須安裝.NET Framework 3.5
       那好,什麼時候我們會需要這種寫法呢?想像一下,你可以利用LINQ查詢函式來做什麼?你可以將兩個陣列Join起來、排序、Group、查詢,你也可以將兩個XML檔案Join起來,甚至可以將兩個DataTable Join起來,哦!這段敘述是否挑到你最敏感的那條神經了呢?
        不過,說歸說,做歸做,如果在.NET Framework 2.0中叫用LINQ,能得到什麼好處呢?很明顯的,你原本的專案不需要做大幅度的升級,你不需要裝Visual Studio 2008,你只需安裝.NET Framework 3.5,然後加入對System.Core的參考,就能得到LINQ查詢函式的火力,再加入System.Xml.Linq的參考,就能得到LINQ To XML查詢函式,加入System.Data.DataSetExtensions的參考,就能將兩個DataTable Join起來。
       但,有了這些好處,事情真的會比較簡單嗎?那得視情況而定,在沒有LINQ Expression支援下使用LINQ查詢函式,有時會將事情變的複雜,換句話說,程式碼可能變多了。不過,大部份情況下,我相信使用LINQ查詢函式會把程式碼縮短,畢竟,查詢演算法是內建在LINQ中了。
      static void DemoLinq()
      {
                  string[] list = new string[] { "code6421", "tom", "david", "cathy" };
                  IEnumerable<string> result = Enumerable.Where<string>(list,
                                   delegate(string item)
                                   {
                                       return item == "tom";
                                   });
                  Console.WriteLine(Enumerable.FirstOrDefault(result));
      }
      上面這段程式碼可以運行於Visual Studio 2005Visual Studio 2008,如你使用Visual Studio 2005,請先安裝.NET Framework 3.5,然後於專案中添加對System.Core的參考(DLL位於Program Files\ Reference Assemblies\Microsoft\Framework\3.5),完成後編譯程式,你便達到於C#,Visual Studio 2005中使用LINQ的目的。
       
      Join 2 DataTables
       
       我想有許多寫Windows Form程式的人,都曾經對於如何Join兩個DataTable困擾過,事實上這很簡單,只要建另一個DataTable,一個蘿蔔一個坑的填即可。
       不過有了LINQ To DataSet,一切都變的簡單且直覺,但!缺少了LINQ Expression的C# 2.0,只憑LINQ 查詢函式來做,可以把這件事變簡單嗎?
      using System.Data.SqlClient;
      ........
      static IEnumerable<JoinData> JoinTables()
      {
                  using (SqlConnection conn = new SqlConnection(
      "Data Source=JEFFRAY;Initial Catalog=Northwind;Integrated Security=True"))
      {
                      SqlDataAdapter adapter1 = new SqlDataAdapter("SELECT * FROM Customers", conn);
                      SqlDataAdapter adapter2 = new SqlDataAdapter("SELECT * FROM Orders", conn);
                      DataTable dt1 = new DataTable("Customers");
                      DataTable dt2 = new DataTable("Orders");
                      adapter1.Fill(dt1);
                      adapter2.Fill(dt2);
       
                      return Enumerable.Join<DataRow,DataRow,string,JoinData>(
                               DataTableExtensions.AsEnumerable(dt2),
                               DataTableExtensions.AsEnumerable(dt1),
                                  delegate(DataRow s1)
                                  {
                                     return s1.IsNull("CustomerID") ?
                                            null : (string)s1["CustomerID"];
                                  },
                                  delegate(DataRow s2)
                                  {
                                     return s2.IsNull("CustomerID") ? null :
                                         (string)s2["CustomerID"];
                                  },
                                  delegate(DataRow s1,DataRow s2)
                                  {
                                      JoinData result = new JoinData();
                                        result.OrderID = s1.IsNull("OrderID") ? -1 :
                                               (int)s1["OrderID"];
                                      result.CompanyName = s2.IsNull("CompanyName") ?
                                        string.Empty : (string)s2["CompanyName"];
                                         return result;
                                   });
                   }
       }
       
      .........
      public class JoinData
      {
              private int _orderID;
              private string _companyName;
              public int OrderID
              {
                  get
                  {
                      return _orderID;
                  }
                  set
                  {
                      _orderID = value;
                  }
              }
       
              public string CompanyName
              {
                  get
                  {
                      return _companyName;
                  }
                  set
                  {
                      _companyName = value;
                  }
              }
      }
      這個程式需要引用System.Data.DataSetExtnesions.DLL,她與System.Core位於同一目錄下,JoinTables的函式傳回值頃印結果如下:
      10779,Morgenstern Gesundkost
      10780,LILA-Supermercado
      10781,Wartian Herkku
      10782,Cactus Comidas para llevar
      10783,Hanari Carnes
      10784,Magazzini Alimentari Riuniti
      10785,GROSELLA-Restaurante
      10786,Queen Cozinha
      10787,La maison d'Asie
      10788,QUICK-Stop
      10789,Folies gourmandes
      10790,Gourmet Lanchonetes
      10791,Frankenversand
      10792,Wolski Zajazd
      10793,Around the Horn
      10794,Que Delicia
      10795,Ernst Handel
      10796,HILARION-Abastos
      10797,Drachenblut Delikatessen
      10798,Island Trading
      10799,Koniglich Essen
      10800,Seven Seas Imports
      ..........................................
       
      歡迎光臨C# 2.0與LINQ的世界。

      发表于 @ 2008年04月25日 06:43:18|评论(loading...)|编辑

      新一篇: LINQ to SQL 中可以使用的LINQ函式 | 旧一篇: Effective Using LINQ To SQL (1) - 分頁技巧

      评论

      #a119797 发表于2008-04-25 08:40:42  IP: 116.25.110.*
      学习了,谢谢~
      #xxx 发表于2008-04-25 09:47:49  IP: 220.181.54.*
      xxxxxxxxx
      #yyyy 发表于2008-04-25 09:48:13  IP: 220.181.54.*
      xxxxxxxxxx
      #thunder43 发表于2008-04-25 10:27:44  IP: 124.42.78.*
      不错,实用 :)
      #youzi1643 发表于2008-04-25 11:10:03  IP: 222.66.90.*
      楼主文笔很有煽动力哦。不错。 呵呵。

      内容更好。谢谢。
      #qqwmly 发表于2008-04-25 12:39:11  IP: 124.128.102.*
      没有简体的啊
      www.xyking.cn
      #spy2008 发表于2008-04-25 15:15:42  IP: 124.131.220.*
      不错
      #yanhua2008 发表于2008-04-26 21:40:31  IP: 61.184.106.*
      搂主太强了 不错 先收下
      #sunkim 发表于2008-04-27 10:11:38  IP: 125.90.59.*
      just so so .year
      #niusdd 发表于2008-04-27 12:40:56  IP: 61.163.70.*
      强人...收藏了!!!
      #phhwr85 发表于2008-04-27 22:55:43  IP: 119.122.33.*
      意义不大!
      #xiaoyaoyu55555 发表于2008-04-28 15:11:42  IP: 210.83.203.*
      很有趣~~~~
      #pjhakka 发表于2008-07-10 18:36:23  IP: 210.64.17.*
      您好~我利用您提供的方法去加入System.Core到vb.net2005,能加入參考,但不能執行Linq的工作?
      c#.net 2005我測試過可以跑,是只有vb 不能用這個方法嗎?
      发表评论  


      登录
      Csdn Blog version 3.1a
      Copyright © Code6421