LINQ TO SQL八大子句
一、form...in子句
含义:指定查询操作的数据源和范围变量
在 LINQ 查询中,第一步是指定数据源。像在大多数编程语言中一样,在 C# 中,必须先声明变量,才能使用它。在 LINQ 查询中,最先使用 from 子句的目的是引入数据源 ( customers) 和范围变量 ( cust)。
//queryAllCustomers is an IEnumerable<Customer>
var queryAllCustomers = from cust in customers
select cust;
二、select子句
含义:指定查询结果的类型和表现形式
select 子句生成查询结果并指定每个返回的元素的“形状”或类型。 例如,您可以指定结果包含的是整个 Customer 对象、仅一个成员、成员的子集,还是某个基于计算或新对象创建的完全不同的结果类型。 当 select 子句生成除源元素副本以外的内容时,该操作称为“投影”。 使用投影转换数据是 LINQ 查询表达式的一种强大功能。
三、where子句
含义:筛选元素的逻辑条件,一般由逻辑运算符组成
也许最常用的查询操作是应用布尔表达式形式的筛选器。此筛选器使查询只返回那些表达式结果为 true 的元素。使用 where 子句生成结果。 实际上,筛选器指定从源序列中排除哪些元素。在下面的示例中,只返回那些地址位于伦敦的 customers。
var queryLondonCustomers = from cust in customers
where cust.City == "London"
select cust;
四、group...by子句
含义:对查询进行分组
使用 group 子句,您可以按指定的键分组结果。 例如,您可以指定结果应按 City 分组,以便位于伦敦或巴黎的所有客户位于各自组中。 在本例中, cust.City 是键。
// queryCustomersByCity is an IEnumerable<IGrouping<string, Customer>>
var queryCustomersByCity =
from cust in customers
group cust by cust.City;
// customerGroup is an IGrouping<string, Customer>
foreach (var customerGroup in queryCustomersByCity)
{
Console.WriteLine(customerGroup.Key);
foreach (Customer customer in customerGroup)
{
Console.WriteLine(" {0}", customer.Name);
}
}
在使用
group 子句结束查询时,结果采用列表的列表形式。 列表中的每个元素是一个具有
Key 成员及根据该键分组的元素列表的对象。 在循环访问生成组序列的查询时,您必须使用嵌套的
foreach 循环。 外部循环用于循环访问每个组,内部循环用于循环访问每个组的成员。
五、order by子句
含义:对查询结果进行排序,可以为“升序”或“降序”
通常可以很方便地将返回的数据进行排序。orderby 子句将使返回的序列中的元素按照被排序的类型的默认比较器进行排序。 例如,下面的查询可以扩展为按 Name 属性对结果进行排序。 因为 Name 是一个字符串,所以默认比较器执行从 A 到 Z 的字母排序。
var queryLondonCustomers3 =
from cust in customers
where cust.City == "London"
orderby cust.Name ascending
select cust;
六、join子句
含义:连接多个查询的操作源
联接运算创建数据源中没有显式建模的序列之间的关联。例如,您可以执行联接来查找符合以下条件的所有客户:位于巴黎,且从位于伦敦的供应商处订购产品。在 LINQ 中, join 子句始终针对对象集合而非直接针对数据库表运行。 在 LINQ 中,您不必像在 SQL 中那样频繁使用 join,因为 LINQ 中的外键在对象模型中表示为包含项集合的属性。 例如, Customer 对象包含 Order 对象的集合。 不必执行联接,只需使用点表示法访问订单:
from order in Customer.Orders...
七、let子句
含义:引入用于存储查询表达式中的子表达式结果的范围变量
在查询表达式中,存储子表达式的结果有时很有用,这样可以在随后的子句中使用。可以使用 let 关键字完成这一工作,该关键字可以创建一个新的范围变量,并且用您提供的表达式的结果初始化该变量。 一旦用值初始化了该范围变量,它就不能用于存储其他值。但如果该范围变量存储的是可查询的类型,则可以对其进行查询。
创建一个可以查询自身的可枚举类型。
使查询只能对范围变量 word 调用一次 ToLower。 如果不使用 let,则必须在 where 子句的每个谓词中调用 ToLower。
class LetSample1
{
static void Main()
{
string[] strings =
{
"A penny saved is a penny earned.",
"The early bird catches the worm.",
"The pen is mightier than the sword."
};
// Split the sentence into an array of words
// and select those whose first letter is a vowel.
var earlyBirdQuery =
from sentence in strings
let words = sentence.Split(' ')
from word in words
let w = word.ToLower()
where w[0] == 'a' || w[0] == 'e'
|| w[0] == 'i' || w[0] == 'o'
|| w[0] == 'u'
select word;
// Execute the query.
foreach (var v in earlyBirdQuery)
{
Console.WriteLine("\"{0}\" starts with a vowel", v);
}
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
"A" starts with a vowel
"is" starts with a vowel
"a" starts with a vowel
"earned." starts with a vowel
"early" starts with a vowel
"is" starts with a vowel
*/
八、into子句
含义:提供一个临时标示符,充当对join、group或select子句的结果
如果您必须引用组操作的结果,可以使用 into 关键字来创建可进一步查询的标识符。 下面的查询只返回那些包含两个以上的客户的组:
// custQuery is an IEnumerable<IGrouping<string, Customer>>
var custQuery =
from cust in customers
group cust by cust.City into custGroup
where custGroup.Count() > 2
orderby custGroup.Key
select custGroup;