任务 7 – 扩展查询表达式
至此,本实验中演示的查询都只进行了最为基本的筛选。但是,LINQ支持许多选项来查询数据,这不仅仅是简单的筛选。例如,为了对伦敦的所有客户根据他们的ContactName进行排序,您可以使用orderby子句:
{
var db = new NorthwindDataContext();
db.Log = Console.Out;
var results = from c in db.Customers
where c.City == "London"
orderby c.ContactName descending
select new { c.ContactName, c.CustomerID };
foreach (var c in results)
Console.WriteLine("{0}\t{1}", c.CustomerID, c.ContactName);
}
static void Main(string[] args)
{
ObjectQuery();
}
点击Ctrl+F5 来构建和运行应用程序。注意,客户是根据第二列 - 名称列,按降充的方式进行排序的。点击任意键以结束应用程序。
可以继续进行不同类型的查询:编写一个查询,计算出位于每个城市的客户数量。为了完成这个任务,您需要使用group by表达式。
{
var db = new NorthwindDataContext();
db.Log = Console.Out;
var results = from c in db.Customers
group c by c.City into g
orderby g.Count() ascending
select new { City = g.Key, Count = g.Count() };
foreach (var c in results)
Console.WriteLine("{0}\t{1}", c.City, c.Count);
}
点击Ctrl+F5 以运行应用程序。查看输出的结果后,, 点击任意键以结束应用程序。
通常,当编写查询时,您需要通过两个表进行搜索。通常可以使用一个join运算符来实现,该运算符在C# 3.0中受到支持。在ObjectQuery中,使用下面的代码替换原来的代码。在前面的任务中,您曾经将所有居住在伦敦的客户的所有订单都查询并打印了出来。在这里,我们不再打印所有的订单,而是打印出每个客户的订单的数量。
{
var db = new NorthwindDataContext();
db.Log = Console.Out;
var results = from c in db.Customers
join e in db.Employees on c.City equals e.City
group e by e.City into g
select new { City = g.Key, Count = g.Count() };
foreach (var c in results)
Console.WriteLine("{0}\t{1}", c.City, c.Count);
}
点击 Ctrl+F5 以运行应用程序。查看输出的结果,以及输出的SQL查询。点击任意键以结束应用程序。
这个示例展示了当数据间没有显式的关系时,如何使用一个SQL样式的联结。
实验总结
在本实验中,您完成了下列练习:
LINQ to Objects: 面向内存中集合的LINQ
LINQ to XML: 面向XML文档的LINQ
LINQ to DataSets: 面向DataSet对象的LINQ
LINQ to SQL: 面向连接数据库的LINQ
本实验展示了LINQ框架及功能如何无缝的集成来自不同数据源的数据访问与处理。LINQ允许您利用SQL的功能和C#的灵活性,来处理内存中的对象。LINQ to SQL和LINQ to DataSets利用这种支持来将您的对象连接到数据库表和数据。最后,LINQ to XML利用XPath的功能实现了XML查询,并简化了C#代码。众多的标准查询运算符为数据处理提供了内置的支持,有些功能在早期的版本中可能需要再去扩展自定义的代码。使用C#与LINQ,查询数据并将数据转换到不同的格式也比以往更加简单。