LIN{UX,Q} : It's time for a refreshment(2)

Setelah refreshment pertama, sekarang refreshment kedua, tentang salah satu fitur .Net yang pernah dibahas pada dotnet internal meeting INDC tahun 2005 lalu. Ya, LINQ sudah terdengar 3 tahun lalu, tapi sampai sekarang belum banyak dimanfaatkan, mungkin karena belum cukup matang dan juga belum didukung oleh versi Visual Studio 2005/.Net 2.0 secara penuh. Setelah Visual Studio 2008 dan .Net 3.5 diluncurkan, barulah kita bisa mulai serius menggunakan LINQ. Kini saatnya untuk menyegarkan kembali dan memperjelas apa yang pernah kita dengar samar-samar sekian tahun lalu.

Apa yang ingin dicapai dengan LINQ? membuat programming menjadi lebih mudah. Dengan LINQ, kita cukup menggunakan satu syntax untuk meng-query berbagai macam sumber data. Tidak peduli sumber datanya dari mana, dari sql-server, dari dataset, dari object, dari file xml atau dari sekumpulan apapun, kita bisa menggunakan syntax yang sama untuk menarik ataupun mengupdate data sesuai yang kita inginkan. Tidak perlu tahu T-SQL untuk query database, tidak perlu tahu Xpath untuk query xml dsb.

image

Bagaimana LINQ membuat programming lebih mudah? sambil lalu kita lihat juga beberapa fitur terbaru dari c# 3.0.

Berikut adalah contoh bagaimana query dari sebuah object yang berisi kumpulan object dilakukan dengan vs2005/c#2.0

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4:  
   5: class Customer
   6: {
   7:  
   8:     string customerID;
   9:     string contactName;
  10:     string city;
  11:  
  12:     public string CustomerID
  13:     {
  14:         get { return customerID; }
  15:         set { customerID = value; }
  16:     }
  17:  
  18:     public string ContactName
  19:     {
  20:         get { return contactName; }
  21:         set { contactName = value; }
  22:     }
  23:  
  24:     public string City
  25:     {
  26:         get { return city; }
  27:         set { city = value; }
  28:     }
  29: }
  30: class Driver
  31: {
  32:     static void Main(string[] args)
  33:     {
  34:         List<Result> results = new List<Result>();
  35:         foreach (Customer c in LoadCustomers())
  36:         {
  37:  
  38:             if (c.City.StartsWith("M"))
  39:             {
  40:                 Result res = results.Find(delegate(Result r)
  41:                      { return c.City == r.City; });
  42:  
  43:                 if (res == null)
  44:                 {
  45:  
  46:                     res = new Result();
  47:                     res.City = c.City;
  48:                     res.Count = 1;
  49:                     results.Add(res);
  50:                 }
  51:                 else
  52:                 {
  53:  
  54:                     res.Count++;
  55:                 }
  56:             }
  57:         }
  58:         foreach (Result r in results)
  59:         {
  60:             Console.WriteLine("City:{0}\tCount:{1}", r.City, r.Count);
  61:         }
  62:     }
  63:  
  64:     static IEnumerable<Customer> LoadCustomers()
  65:     {
  66:  
  67:         List<Customer> custs = new List<Customer>();
  68:  
  69:         Customer c = new Customer();
  70:         c.CustomerID = "ALFKI";
  71:         c.ContactName = "Maria Anders";
  72:         c.City = "Berlin";
  73:         custs.Add(c);
  74:  
  75:         #region many customers ...
  76:  
  77:         c = new Customer();
  78:         c.CustomerID = "ANATR";
  79:         c.ContactName = "Ana Trujillo";
  80:         c.City = "México D.F.";
  81:         custs.Add(c);
  82:  
  83:         c = new Customer();
  84:         c.CustomerID = "ANTON";
  85:         c.ContactName = "Antonio Moreno";
  86:         c.City = "México D.F.";
  87:         custs.Add(c);
  88:  
  89:         c = new Customer();
  90:         c.CustomerID = "AROUT";
  91:         c.ContactName = "Thomas Hardy";
  92:         c.City = "London";
  93:         custs.Add(c);
  94:  
  95:         c = new Customer();
  96:         c.CustomerID = "BERGS";
  97:         c.ContactName = "Christina Berglund";
  98:         c.City = "Luleå";
  99:         custs.Add(c);
 100:  
 101:         c = new Customer();
 102:         c.CustomerID = "BLAUS";
 103:         c.ContactName = "Hanna Moos";
 104:         c.City = "Mannheim";
 105:         custs.Add(c);
 106:  
 107:         c = new Customer();
 108:         c.CustomerID = "BLONP";
 109:         c.ContactName = "Frédérique Citeaux";
 110:         c.City = "Strasbourg";
 111:         custs.Add(c);
 112:  
 113:         c = new Customer();
 114:         c.CustomerID = "BOLID";
 115:         c.ContactName = "Martín Sommer";
 116:         c.City = "Madrid";
 117:         custs.Add(c);
 118:  
 119:         c = new Customer();
 120:         c.CustomerID = "BONAP";
 121:         c.ContactName = "Laurence Lebihan";
 122:         c.City = "Marseille";
 123:         custs.Add(c);
 124:  
 125:         c = new Customer();
 126:         c.CustomerID = "BOTTM";
 127:         c.ContactName = "Elizabeth Lincoln";
 128:         c.City = "Tsawassen";
 129:         custs.Add(c);
 130:  
 131:         c = new Customer();
 132:         c.CustomerID = "BSBEV";
 133:         c.ContactName = "Victoria Ashworth";
 134:         c.City = "London";
 135:         custs.Add(c);
 136:  
 137:         c = new Customer();
 138:         c.CustomerID = "CACTU";
 139:         c.ContactName = "Patricio Simpson";
 140:         c.City = "Buenos Aires";
 141:         custs.Add(c);
 142:  
 143:         c = new Customer();
 144:         c.CustomerID = "CENTC";
 145:         c.ContactName = "Francisco Chang";
 146:         c.City = "México D.F.";
 147:         custs.Add(c);
 148:  
 149:         c = new Customer();
 150:         c.CustomerID = "CHOPS";
 151:         c.ContactName = "Yang Wang";
 152:         c.City = "Bern";
 153:         custs.Add(c);
 154:  
 155:         c = new Customer();
 156:         c.CustomerID = "COMMI";
 157:         c.ContactName = "Pedro Afonso";
 158:         c.City = "Sao Paulo";
 159:         custs.Add(c);
 160:  
 161:         c = new Customer();
 162:         c.CustomerID = "CONSH";
 163:         c.ContactName = "Elizabeth Brown";
 164:         c.City = "London";
 165:         custs.Add(c);
 166:  
 167:         c = new Customer();
 168:         c.CustomerID = "DRACD";
 169:         c.ContactName = "Sven Ottlieb";
 170:         c.City = "Aachen";
 171:         custs.Add(c);
 172:  
 173:         c = new Customer();
 174:         c.CustomerID = "DUMON";
 175:         c.ContactName = "Janine Labrune";
 176:         c.City = "Nantes";
 177:         custs.Add(c);
 178:  
 179:         c = new Customer();
 180:         c.CustomerID = "EASTC";
 181:         c.ContactName = "Ann Devon";
 182:         c.City = "London";
 183:         custs.Add(c);
 184:  
 185:         c = new Customer();
 186:         c.CustomerID = "ERNSH";
 187:         c.ContactName = "Roland Mendel";
 188:         c.City = "Graz";
 189:         custs.Add(c);
 190:  
 191:         c = new Customer();
 192:         c.CustomerID = "FAMIA";
 193:         c.ContactName = "Aria Cruz";
 194:         c.City = "Sao Paulo";
 195:         custs.Add(c);
 196:  
 197:         c = new Customer();
 198:         c.CustomerID = "FISSA";
 199:         c.ContactName = "Diego Roel";
 200:         c.City = "Madrid";
 201:         custs.Add(c);
 202:  
 203:         c = new Customer();
 204:         c.CustomerID = "FOLIG";
 205:         c.ContactName = "Martine Rancé";
 206:         c.City = "Lille";
 207:         custs.Add(c);
 208:  
 209:         c = new Customer();
 210:         c.CustomerID = "FOLKO";
 211:         c.ContactName = "Maria Larsson";
 212:         c.City = "Bräcke";
 213:         custs.Add(c);
 214:  
 215:         c = new Customer();
 216:         c.CustomerID = "FRANK";
 217:         c.ContactName = "Peter Franken";
 218:         c.City = "München";
 219:         custs.Add(c);
 220:  
 221:         c = new Customer();
 222:         c.CustomerID = "FRANR";
 223:         c.ContactName = "Carine Schmitt";
 224:         c.City = "Nantes";
 225:         custs.Add(c);
 226:  
 227:         c = new Customer();
 228:         c.CustomerID = "FRANS";
 229:         c.ContactName = "Paolo Accorti";
 230:         c.City = "Torino";
 231:         custs.Add(c);
 232:  
 233:         c = new Customer();
 234:         c.CustomerID = "FURIB";
 235:         c.ContactName = "Lino Rodriguez";
 236:         c.City = "Lisboa";
 237:         custs.Add(c);
 238:  
 239:         c = new Customer();
 240:         c.CustomerID = "GALED";
 241:         c.ContactName = "Eduardo Saavedra";
 242:         c.City = "Barcelona";
 243:         custs.Add(c);
 244:  
 245:         c = new Customer();
 246:         c.CustomerID = "GODOS";
 247:         c.ContactName = "José Pedro Freyre";
 248:         c.City = "Sevilla";
 249:         custs.Add(c);
 250:  
 251:         c = new Customer();
 252:         c.CustomerID = "GOURL";
 253:         c.ContactName = "André Fonseca";
 254:         c.City = "Campinas";
 255:         custs.Add(c);
 256:  
 257:         c = new Customer();
 258:         c.CustomerID = "GREAL";
 259:         c.ContactName = "Howard Snyder";