65.9K
CodeProject 正在变化。 阅读更多。
Home

更好的 LINQ 和更好的示例

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.53/5 (14投票s)

2008 年 9 月 9 日

CPOL

3分钟阅读

viewsIcon

121197

downloadIcon

3588

在这里,我们将以一个公司为实际案例来探索 LINQ

引言

什么是 LINQ?

LINQ 代表语言集成查询,现已成为 Visual Studio 2008 的一个组成部分。

LINQ 具有强大的查询任何数据源的能力,数据源可以是对象集合、数据库或 XML 文件。我们可以轻松地从任何实现了 IEnumerable<T> 接口的对象中检索数据。 Microsoft 基本上将 LINQ 分为三个领域,如下所示。

  • LINQ to Object
  • LINQ to ADO.Net  
    • LINQ to SQL
    • LINQ to Dataset
    • LINQ to Entities
  • LINQ to XML

 

LINQ 的基本示例(针对初学者)

http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

假设您了解 LINQ 的基础知识,我将继续使用一个稍微高级的示例,让我们继续使用一个公司的例子。

 

 

公司示例: 

  • 下载: 

在这里,我们将看到如何在公司模块中使用 linq。

公司类将包含一个员工类集合,员工将包含一个用于个人地址的结构。

层次结构: 

 

BasicLINQSample/CompanyLINQ.JPG

 

如果我们有一个具有上述层次结构的项目,让我们看看如何使用 LINQ 访问来自多层类的详细信息。

 

在创建公司之后,我们将尝试在多层上查找详细信息,并查看如何有条件地获取数据。

1) 列出员工的详细信息

2) 统计每家公司中员工的人数

3) 列出居住在以下地区的员工班加罗尔

4) 列出每家公司中薪水最高的员工

5) 总体上薪水最高的员工

6) 各公司在每个城市支付的薪水

7) 各公司在每个城市支付的薪水。

 

列出员工的详细信息

现在我们将列出所有员工及其详细信息和公司名称。

var EmpDetails = from comp in ListCompany 
                 select new {
                       Emp = (from emp in comp.ListEmp  
                              select new {
                                   Company = comp.Name, 
                                   emp 
                              })
                  }; 

在这里,我们使用子查询,因为我们需要所有员工的详细信息及其各自的公司名称,并且这两个详细信息位于不同的层级。

因此,首先我们遍历公司列表中的公司  

from comp in ListCompany  

然后,在每个选定的公司中,它遍历每个员工

from emp in comp.ListEmp 

  

统计每家公司中员工的人数

  var LessEmp = from  Comp in  ListCompany  
                select new { 
                                       Comp.Name,
                       EmpCount = Comp.ListEmp.Count
                            };   

列出居住在以下地区的员工班加罗尔: 

在这里,我们使用复合 from 子句来检索居住在包含 BAN 或 ban 的任何城市的员工。  

var EmpInACity = from comp in ListCompany 

                 from emplist in comp.ListEmp 
                 where emplist.Address.City.ToUpper().Contains(&quot;BAN&quot;)
                 select new {
                        CompName = comp.Name,
                        EmployeeName = emplist.Name 
                 }; 

列出每家公司中薪水最高的员工 

为了找到薪水最高的员工,我们首先使用复合 from 子句遍历每家公司和每家公司的员工。

Where 条件仅筛选那些薪水等于当前公司最高薪水的员工。 

var  EmpHighSalEachComp = from comp in ListCompany 
                          from empHigh in comp.ListEmp  
                          where empHigh.salary == comp.ListEmp.Max(
                          HighEmp => HighEmp.salary) 
                          select new {
                                 CompanyName = comp.Name, 
                                 EmpHighName = empHigh.Name,
                                 EmpHighSal = empHigh.salary
                          }; 

总体上薪水最高的员工

遵循相同的上述过程,但唯一的区别在于 where 条件,我们在这里将员工的薪水与所有公司中的最高薪水进行匹配。 

var EmpHighSal = from comp in ListCompany
                 from emp in comp.ListEmp 
                 where emp.salary == ListCompany.Max(
                 TComp => TComp.ListEmp.Max(HighEmp => HighEmp.salary))
                 select new {
                        CompanyName = comp.Name ,
                        EmployeeName = emp.Name,
                        EmpSal = emp.salary
                 }; 

各公司在每个城市支付的薪水: 

在这里,我们将按城市分组,并汇总居住在该城市员工的所有薪水。 

var CompanyCityWise = from comp in ListCompany          

                      from emp in comp.ListEmp 
                                       group emp by emp.Address.City into CityWiseEmp 
                      select new {
                             State = CityWiseEmp.Key, 
                             TotalSalary = CityWiseEmp.Sum(emp => emp.salary) 
                      }; 

各公司在每个城市支付的薪水。 

在这里,对每家公司应用一个 group by 子句,并从每家公司获取居住在不同地点的员工。

var  CityWiseSalary = from comp in ListCompany 
                      select new { 
                             comp.Name,
                             Emp =(from emp in comp.ListEmp 
                             group emp by emp.Address.City into CityWiseEmp
                             select new {
                                    State = CityWiseEmp.Key,
                                    TotalSalary = CityWiseEmp.Sum(emp => emp.salary) 
                             })
                      }; 

有关 LINQ 的更多参考资料

更多 LINQ 示例: 

http://csharpbasic.blogspot.com/ 

深入了解 LINQ:(Naveen 的 Weblog)

http://codingsense.wordpress.com/

简而言之的标准查询运算符

http://msdn.microsoft.com/en-us/library/bb308959.aspx#linqoverview_topic8

更多 LINQ: 

http://msdn.microsoft.com/en-us/library/bb397676.aspx

欢迎提出任何建议。

学习愉快 :) 

 

© . All rights reserved.