Yup! Barang yg namanya LINQ ini keren! (Okay, I still have concern on DLINQ)...
But... LINQ is more than just what we know as ORM today. ORM is just a SUBSET of it!
Baru aja ikut session Anders Hejlsberg tentang LINQ.
LINQ adds query capabilities to the CLR and languages that target it. The query facility builds on lambda expressions and expression trees to allow predicates, projections, and key extraction expressions to be used as opaque executable code or as transparent in-memory data suitable for downstream processing or translation. The standard query operators defined by the LINQ project work over any IEnumerable<T>-based information source, and are integrated with ADO.NET (DLinq) and System.Xml (XLinq) to allow relational and XML data to gain the benefits of language integrated query. Selain itu, query juga bisa dilakukan pada Typed Object. So, Query to anything. Dlinq is the one that is mapped to ORM. LINQ is BIGGER. :)
Karena yg 'rame' di community kita cuma yg 'ORM', here's some sample of DLinq code (saya pakai public field, bukan property... buru-buru sih ... but please focus on DLinq) :
[Table(Name="Customers")]
public class Customer
{
public string CustomerID;
public string City;
}
[Table(Name="Customers")]
public class Customer
{
[Column(Id=true)]
public string CustomerID;
[Column]
public string City;
}
with DLinq, you can do this:
DataContext db = new DataContext("c:\\northwind\\northwnd.mdf");
// Get a typed table to run queries
Table<Customer> Customers = db.GetTable<Customer>();
// Query for customers from London
var q =
from c in Customers
where c.City == "London"
select c;
foreach (var cust in q)
Console.WriteLine("id = {0}, City = {1}", cust.CustomerID, cust.City);
Sesuai fungsinya, ORM, mesti juga bisa persist ke Database... so, setelah kita bermain2 dgn state object yg kita punya, kita bisa persist object tsn ke Database cukup dgn:
// Ask the DataContext to save all the changes
db.SubmitChanges();
Cool, hah?
O ya, DLinq ini support Lazy Load, Concurrency (Optimistic dgn Field Checking & Time Stamp), bisa autogenerated query bisa Stored Procedures, asscociation/relationship & kedepannya inheritance. DLinq yg bagian dari project LINQ ini adalah bagian dari future ADO.NET... so, it all will be better OO... (NOT THAT UGLY DATASET AGAIN!!!)
But, saya punya concern dgn cara DLinq yaitu kita hrs memberi Tag [Table] ke nama class & [Column] ke member class. Ini berakibat semakin buruk saat kita define asscociation antar object. Code-nya jd gak elegan. Lalu, kayaknya bikin object & DB jd tightcoupled. Here's some example:
[Table(Name="Customers")]
public class Customer
{
[Column(Id=true)]
public string CustomerID;
...
private EntitySet<Order> _Orders;
[Association(Storage="_Orders", OtherKey="CustomerID")]
public EntitySet<Order> Orders {
get { return this._Orders; }
set { this._Orders.Assign(value); }
}
}
[Table(Name="Orders")]
public class Order
{
[Column(Id=true)]
public int OrderID;
[Column]
public string CustomerID;
private EntityRef<Customer> _Customer;
[Association(Storage="_Customer", ThisKey="CustomerID")]
public Customer Customer {
get { return this._Customer.Entity; }
set { this._Customer.Entity = value; }
}
}
Di class Order, dia sudah punya member berupa Customer.. but kita tetap require utk put CustomerID sbg member! Gak elegant! ORM dari DevExpress yg skrg saya pakai (XPO) bisa lebih elegant dlm hal ini.
I'll keep you guys posted!