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

LINQ 新手 FAQ

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (51投票s)

2009 年 3 月 5 日

CPOL

5分钟阅读

viewsIcon

138576

downloadIcon

1647

LINQ 新手的常见问题解答。

引言

引言和目标

在本节中,我们将回顾 LINQ 的基础知识,然后看五个基本的 LINQ 查询,这些查询在你的项目中总是会用到。在回顾基础知识的同时,我们还将尝试学习 LINQ 从中间层业务对象的角度解决了哪些问题。

你可以下载我的 1000 个问答 .NET 书籍。我敢肯定你会喜欢的。

其他 LINQ FAQ

LINQ FAQ 第二部分:在本 FAQ 中,我们将看到 LINQ to SQL 的基本示例,如何使用 LINQ 定义一对一和一对多关系,如何优化 LINQ 查询,使用 LINQ 执行存储过程,以及最后使用 LINQ to SQL 的一个简单 CRUD 示例。

定义 LINQ

LINQ 是一种统一的数据访问编程模型。LINQ 使你能够独立于数据源来查询和操作数据。下图显示了 .NET 语言如何在 LINQ 编程模型之上以统一的方式处理任何数据源。它就像一种可以查询任何数据源和任何转换的查询语言。LINQ 还提供了完整的类型安全和编译时检查。LINQ 可以作为中间层的一个很好的实体。它将位于 UI 和数据访问层之间。

下面是一个简单的 LINQ 示例。我们有一个数据集合 `objcountries`,LINQ 对它进行查询,查找国家名称为 'India' 的记录。集合 `objcountries` 可以是任何数据源:数据集、数据读取器、XML 等。下图显示了 `ObjCountries` 可以是任何数据。然后我们查询 `CountryCode` 并循环遍历它。

从业务对象的角度来看,LINQ 如何帮助我们?

业务对象中最繁琐的工作之一就是解析和搜索对象集合。例如,考虑下图,我们想通过 ID 值搜索一个国家。我们所做的是遍历集合并获取对象。很多人可能会争论在 `List` 或 `Array` 中保留一个键。下面仅为一个示例。如果你想使用国家代码和名称进行搜索,列表/集合键将无法用于多值搜索。

换句话说,使用 LINQ,我们可以查询业务对象集合,并使用单个 LINQ 查询过滤集合。

你能解释一下基本的 LINQ 查询是什么样的吗?

为了理解一个基本的 LINQ 查询,让我们创建一个小型示例项目。让我们以客户数据为例,其中包含客户和订单。

客户名称 客户代码 城市 订单
Khadak 001 孟买
  • Shirts
  • Socks
Shiv 002 Delhi
  • Pants
Raju 003 孟买
  • Socks
Shaam 004 Delhi
  • Shoes

我们将数据弄得复杂一些,让一个客户有多个订单,换句话说,我们有一个一对多的关系。

所以我们创建两个类:客户类包含一个地址类集合。下面是类结构的样子,用于处理客户和多个地址的一对多关系。

多个地址是聚合在 `customer` 类中的数组集合。下面是一个代码片段,它使用上面表格中提供的硬编码数据加载 `customer` 和 `address` 集合。目前它是硬编码的,但这也可以从数据库或其他来源加载。

clsCustomer[] objCustomer = new clsCustomer[]
{
	new clsCustomer{CustomerName="Khadak",customerCode="001",
	  City="Mumbai",Orders = new clsOrder[] {new clsOrder{ProductName="Shirt"},
	  new clsOrder{ProductName="Socks"}}},
	  new clsCustomer{CustomerName="Shiv",customerCode="002",
	    City="Delhi",Orders = new clsOrder[]{new clsOrder{ProductName="Pants"}}},
      new clsCustomer{CustomerName="Raju",customerCode="003",
        City="Mumbai",Orders = new clsOrder[]{new clsOrder{ProductName="Socks"}}},
      new clsCustomer{CustomerName="Shaam",customerCode="004",
        City="Delhi",Orders = new clsOrder[]{new clsOrder{ProductName="Shoes"}}}};

一个基本的 LINQ 查询看起来像下面这样。它以动词 `from` 开头,后跟数据类型和对象,即 `clsCustomer` 和 `obj` 对象。`objCustomer` 是包含 `customer` 和 `address` 的集合,我们已在顶部加载。`select obj` 表示我们需要所有值。

from clsCustomer obj in objCustomer select obj

下图在右侧显示了 LINQ 查询。在左侧,我们遍历了对象集合。

我们创建了一个简单的项目,演示了一个基本的 LINQ 查询,你可以下载它来了解它的实际工作原理。下图显示了这个简单查询的执行。

如何编写 LINQ 查询来带条件搜索?

我们需要将 `where` 子句放在 `select` 关键字之前。

return from clsCustomer Obj in objCustomer where Obj.customerCode == “001” select Obj;

下图显示了 `where` 子句的实际应用。

如何使用 LINQ 查询进行联接?

下面是一个用于在对象集合之间创建联接的 LINQ 代码片段。在这种情况下,我们在 `customer` 和 `order` 之间创建了一个 `join`。如果你还记得,`order` 集合包含在 `customer` 类中。

return from clsCustomer ObjCust in objCustomer 
from clsOrder ObjOrder in ObjCust.Orders
select ObjCust;

下图显示了 LINQ `join` 查询的结果

如何使用 LINQ 查询进行分组?

下面的代码片段显示了如何使用 LINQ 编写 `group by` 查询。你可以看到我们首先创建了一个临时变量 `GroupTemp`,然后使用 `Select` 子句返回它。

var GroupCustomers = from ObjCust in objCustomer
group ObjCust by ObjCust.City into GroupTemp
select new {GroupTemp.Key,GroupTemp};

下图显示了 `group by` 的实际应用。

如何使用 LINQ 查询进行排序?

`Order by` 在 LINQ 中非常简单。我们只需要在 `Select` 查询之前插入 `order by`。

return from clsCustomer ObjCust in objCustomer
orderby ObjCust.City
select ObjCust;

下图显示了我们如何按 `city` 名称排序。

历史

  • 2009 年 3 月 5 日:初始版本

如需进一步阅读,请观看以下面试准备视频和分步视频系列。

© . All rights reserved.