LINQ Experimental Support
Well, Oliver has taken the lead over me announcing the LINQ support in his message. Hopefully, the community will appreciate some additional information on this subject from me.
The XPO 2006.3 release includes a new assembly - DevExpress.Xpo.v6.3.Query. This assembly implements the XPQuery class for constructing LINQ expressions against persistent objects. To run the attached sample project, you should have Visual Studio 2005, SQL Server 2005, XPO v6.3, LINQ Preview (May 2006) and ADO.NET vNext CTP (August 2006) installed. Below are the sample expressions from our project.
Please pay attention to the fact that XPO LINQ expressions are turned into pure database queries. That is, an expression is processed on the database server's side and only the requested objects (or a scalar value) are loaded onto the client. To see all of this in action, take a close look at the database queries executed by XPO (displayed in a log window in our sample project).
There are more LINQ methods which are already supported by XPO, but haven't been demonstrated in the attached sample. Such methods include All, First, FirstOrDefault, Union, EqualAll, etc. We are open to suggestions and bug reports as we move forward with improved LINQ support. Do note, however, that the current status of this support is "experimental" and LINQ itself is only in CTP stage.
The Attachment
The XPO 2006.3 release includes a new assembly - DevExpress.Xpo.v6.3.Query. This assembly implements the XPQuery class for constructing LINQ expressions against persistent objects. To run the attached sample project, you should have Visual Studio 2005, SQL Server 2005, XPO v6.3, LINQ Preview (May 2006) and ADO.NET vNext CTP (August 2006) installed. Below are the sample expressions from our project.
// simple Select with Where and OrderBy clauses XPQuery<Customer> customers = new XPQuery<Customer>(Session.DefaultSession); XPQuery<Order> orders = new XPQuery<Order>(Session.DefaultSession); XPQuery<Employee> employees = new XPQuery<Employee>(Session.DefaultSession); var list = from c in customers where c.Country == "Germany" where c.ContactTitle == "Sales Representative" orderby c.ContactName select c; foreach(Customer cust in list) Console.WriteLine("{0}\t{1}\t{2}", cust.ContactName, cust.Country, cust.ContactTitle); ... // Select Top 5 objects var list = (from o in orders orderby o.ShippedDate descending select o).Take(5); foreach(Order order in list) Console.WriteLine("{0}\t{1}", order.OrderID, order.ShippedDate); ... // Join customers with an aggregation on their Orders var list = from c in customers join o in orders on c equals o.Customer into oo where oo.Count() >= 1 select new { c.CompanyName, OrderCount = oo.Count() }; foreach(var item in list) Console.WriteLine("{0}\t{1}", item.CompanyName, item.OrderCount); ... // an example of aggregated functions (Count and Average) var list = from o in orders select o; int count = list.Count(); Console.WriteLine("Orders Row Count: {0}", count)); decimal avg = list.Average(x => x.Freight); Console.WriteLine("Orders Average Freight: {0:c2}", avg); ... // Select with Group By var list = from c in customers group c by c.ContactTitle into cc where cc.Count() >= 1 select new { Title = cc.Key, Count = cc.Count()}; foreach(var item in list) Console.WriteLine("{0}\t{1}", item.Title, item.Count); ... // Any method bool result = customers.Any(c => c.Country == "Spain"); Console.WriteLine("Is there any customer from Spain? {0}", result ? "Yes" : "No"); result = customers.Any(c => c.Country == "Monaco"); Console.WriteLine("Is there any customer from Monaco? {0}", result ? "Yes" : "No");
Please pay attention to the fact that XPO LINQ expressions are turned into pure database queries. That is, an expression is processed on the database server's side and only the requested objects (or a scalar value) are loaded onto the client. To see all of this in action, take a close look at the database queries executed by XPO (displayed in a log window in our sample project).
There are more LINQ methods which are already supported by XPO, but haven't been demonstrated in the attached sample. Such methods include All, First, FirstOrDefault, Union, EqualAll, etc. We are open to suggestions and bug reports as we move forward with improved LINQ support. Do note, however, that the current status of this support is "experimental" and LINQ itself is only in CTP stage.
The Attachment
Free DevExpress Products - Get Your Copy Today
The following free DevExpress product offers remain available. Should you have any questions about the free offers below, please submit a ticket via the DevExpress Support Center at your convenience. We'll be happy to follow-up.
Recent Posts
Dennis Garavsky (DevExpress)
Dennis Garavsky (DevExpress)
Dennis Garavsky (DevExpress)
The DevExpress Team
The DevExpress Team