Standard Query Operators
[索引页]
大家好,谢谢来到这里!
上一次我们谈到C Key 关键字,在LINQ中只知道 C# Key Wordkeys 还不够,还需要知道标准查询操作符号(Standard Query Operators),其实在之前LINQ to DataSet和C# Key Wordkeys已经谈到关于这方面的内容,而这一次我们来好好来体验下Standard Query Operators!
首先我们为大家整理下概念,然后就来区分一下那些要延迟执行,那些不要和那些对查询语法的支持.然后我们就利用LINQ to SQL将数据加载上来,之我们就来见这写操作符一个一个的来使用,其中每一个操作符我都分QuerySyntax,MethodSyntax来两种方式.
最后就是请多指教.
Standard Query Operators
一基本概念
标准查询操作符是一系列的方法.这些方法操作实现IEnumerable(T)和IQueryable(T)接口的有序数据.他们能做过滤,聚集,排序等.
LINQ Standard Query Operators 分IEnumerable(T)和IQueryable(T)两类,所有的方法都产生于Enumerable和Queryable类的静态成员.当然还有一些是这些类的extension methods.
因为在LINQ中查询数据时,数据需要被封装成对象,如果你的本地数据没有被封装成为对象,这个数据就必须影射到对象域中(objcet domain),之后我们使用查询操作符号去查询,这时既执行LINQ的query processing engine(LINQ query processing engine)和via扩展机制,将查询结果返回到内存中,在内存中为集合.
如果集合类型实现IEnumerable<T>,它执行本地LINQ查询执行引擎和如果它实现IQueryable<T>,它会调用expression tree来实现. 里面Enumerable类有两方法一个是Cast(TResult)(IEnumerable)和 OfType(TResult)(IEnumerable)来实现IEnumerable(T)接口,能让你在非参数化,或非泛性的集合下使用LINQ,这样能创建强类型的集合,而Queryable类也有两个方法Cast(TResult)(IQueryable)和 OfType(TResult)(IQueryable),同样也是操作Queryable.
Standard Query Operators API 的方法定义在 System.Query.Sequence static 类中 在 System.Query.dll中.(下面我们会用到这些概念)
标准查询操作符在执行时有两中不同的执行方式如果方法返回是独立的值(singleton value)就会立即执行,如果返回的是有序的值(Sequence value),就会延迟执行.而且会返回enumerable对象.
这里可能开提一个问题就是Method Syntax和Query Syntax的区别.Query Syntax就是使用查询语法,Method Syntax就是像方法调用样的来查询.两者可以混合在一起使用.
像这样:
二 准备
上几篇文章都是控制台,这一次我们玩windonw From
(1)界面:(不是很好看)
使用数据库:AdventureWorks中[Person].[Contact]表
[HumanResources.Employee]表,[Sales.Individual]表,[Sales.Customer]表
(2)结构:
(3)ShowData中填写:
这是上面查询的SQL
(4)再向QuerySyntax 的button中的event写入下面代码(Close button就是大家熟悉的退出程序)
相信大家都是很熟悉的
(5)再向MethodSyntax写:
我们分为QuerySyntax,MethodSyntax看上面你就知道,分别显示在ListBox1和ListBox2中,他们大多查询结果都是一样的,但并不所有查询结果都是一样的,不同的操作符号,具体分析.在右边的那一排按钮就触发不同的操作符在ListBoxs中输出值.还有一个按钮有多个相关的操作符号的操作在里面,如SelectMany里面就是Select和SelectMany!
(6)再看分级别的情况
分立即执行:读取数据源与操作一起执行,这样的操作符号返回一个值,这个值是非enumerable类型.
延迟执行:延迟执行就是在查询声明时,没有执行.当到在foreach中使用时才执行.这样返回值的类型为IEnumerable(T) 或 IOrderedEnumerable(TElement).
但延迟执行又分Streaming或non-streaming
------ Streaming:是指边读取数据边产生相应的元素.
------ Non-Streaming:读完数据后再产生元素.
表
还需要关注标准查询符对查询语法的支持
参照MSDN,但不是很全.它比较分散,下面是我自己统计的.
worksguo
Standard Query Operators(2)
大家好,谢谢来到这里!
上一次我们谈到C Key 关键字,在LINQ中只知道 C# Key Wordkeys 还不够,还需要知道标准查询操作符号(Standard Query Operators),其实在之前LINQ to DataSet和C# Key Wordkeys已经谈到关于这方面的内容,而这一次我们来好好来体验下Standard Query Operators!
首先我们为大家整理下概念,然后就来区分一下那些要延迟执行,那些不要和那些对查询语法的支持.然后我们就利用LINQ to SQL将数据加载上来,之我们就来见这写操作符一个一个的来使用,其中每一个操作符我都分QuerySyntax,MethodSyntax来两种方式.
最后就是请多指教.
Standard Query Operators
一基本概念
标准查询操作符是一系列的方法.这些方法操作实现IEnumerable(T)和IQueryable(T)接口的有序数据.他们能做过滤,聚集,排序等.
LINQ Standard Query Operators 分IEnumerable(T)和IQueryable(T)两类,所有的方法都产生于Enumerable和Queryable类的静态成员.当然还有一些是这些类的extension methods.
因为在LINQ中查询数据时,数据需要被封装成对象,如果你的本地数据没有被封装成为对象,这个数据就必须影射到对象域中(objcet domain),之后我们使用查询操作符号去查询,这时既执行LINQ的query processing engine(LINQ query processing engine)和via扩展机制,将查询结果返回到内存中,在内存中为集合.
如果集合类型实现IEnumerable<T>,它执行本地LINQ查询执行引擎和如果它实现IQueryable<T>,它会调用expression tree来实现. 里面Enumerable类有两方法一个是Cast(TResult)(IEnumerable)和 OfType(TResult)(IEnumerable)来实现IEnumerable(T)接口,能让你在非参数化,或非泛性的集合下使用LINQ,这样能创建强类型的集合,而Queryable类也有两个方法Cast(TResult)(IQueryable)和 OfType(TResult)(IQueryable),同样也是操作Queryable.
Standard Query Operators API 的方法定义在 System.Query.Sequence static 类中 在 System.Query.dll中.(下面我们会用到这些概念)
标准查询操作符在执行时有两中不同的执行方式如果方法返回是独立的值(singleton value)就会立即执行,如果返回的是有序的值(Sequence value),就会延迟执行.而且会返回enumerable对象.
这里可能开提一个问题就是Method Syntax和Query Syntax的区别.Query Syntax就是使用查询语法,Method Syntax就是像方法调用样的来查询.两者可以混合在一起使用.
像这样:
List<int> numbers1 = new List<int>() { 5, 4, 1, 7,3,13,16,11,18, 9, 8, 6, 7, 2, 0,12, };
int numCount1 =
(from num in numbers1
where num < 3 || num > 7
select num).Count();
int numCount1 =
(from num in numbers1
where num < 3 || num > 7
select num).Count();
二 准备
上几篇文章都是控制台,这一次我们玩windonw From
(1)界面:(不是很好看)
使用数据库:AdventureWorks中[Person].[Contact]表
[HumanResources.Employee]表,[Sales.Individual]表,[Sales.Customer]表
(2)结构:
[Table(Name = "Person.Contact")]
public class Contact
{
[Column(DbType = "int not null")]
public int ContactID;
[Column(DbType = "nvarchar(8) not null")]
public string Title;
[Column(DbType = "nvarchar(50) not null")]
public string FirstName;
[Column(DbType = "nvarchar(50) not null")]
public string MiddleName;
[Column(DbType = "nvarchar(50) not null")]
public string LastName;
[Column(DbType = "nvarchar(50) not null")]
public string EmailAddress;
[Column(DbType = "int")]
public int EmailPromotion;
}
[Table(Name = "HumanResources.Employee")]
public class Employee
{
[Column(DbType = "int not null")]
public int ContactID;
[Column(DbType = "datetime not null")]
public string HireDate;
[Column(DbType = "int not null")]
public int EmployeeID;
[Column(DbType = "nvarchar(50) not null")]
public string Title;
}
[Table(Name = "Sales.Individual")]
public class Individual
{
[Column(DbType = "int not null")]
public int ContactID;
[Column(DbType = "int not null")]
public int CustomerID;
}
[Table(Name = "Sales.Customer")]
public class Customer
{
[Column(DbType = "int not null")]
public int CustomerID;
[Column(DbType = "varchar(10) not null")]
public string AccountNumber;
}
DataContext context = new DataContext("Initial Catalog=AdventureWorks;Integrated Security=sspi");
public class Contact
{
[Column(DbType = "int not null")]
public int ContactID;
[Column(DbType = "nvarchar(8) not null")]
public string Title;
[Column(DbType = "nvarchar(50) not null")]
public string FirstName;
[Column(DbType = "nvarchar(50) not null")]
public string MiddleName;
[Column(DbType = "nvarchar(50) not null")]
public string LastName;
[Column(DbType = "nvarchar(50) not null")]
public string EmailAddress;
[Column(DbType = "int")]
public int EmailPromotion;
}
[Table(Name = "HumanResources.Employee")]
public class Employee
{
[Column(DbType = "int not null")]
public int ContactID;
[Column(DbType = "datetime not null")]
public string HireDate;
[Column(DbType = "int not null")]
public int EmployeeID;
[Column(DbType = "nvarchar(50) not null")]
public string Title;
}
[Table(Name = "Sales.Individual")]
public class Individual
{
[Column(DbType = "int not null")]
public int ContactID;
[Column(DbType = "int not null")]
public int CustomerID;
}
[Table(Name = "Sales.Customer")]
public class Customer
{
[Column(DbType = "int not null")]
public int CustomerID;
[Column(DbType = "varchar(10) not null")]
public string AccountNumber;
}
DataContext context = new DataContext("Initial Catalog=AdventureWorks;Integrated Security=sspi");
(3)ShowData中填写:
Table<Contact> contact = context.GetTable<Contact>();
//QuerySyntax Restriction Operator
var query = from c in contact
where c.FirstName.StartsWith("S") && c.LastName.StartsWith("K")
orderby c.LastName
select c;
foreach (var item in query)
listBox3.Items.Add(item.FirstName + " " + item.LastName + " " + item.EmailAddress);
//QuerySyntax Restriction Operator
var query = from c in contact
where c.FirstName.StartsWith("S") && c.LastName.StartsWith("K")
orderby c.LastName
select c;
foreach (var item in query)
listBox3.Items.Add(item.FirstName + " " + item.LastName + " " + item.EmailAddress);
这是上面查询的SQL
SELECT [t0].[Title], [t0].[FirstName], [t0].[MiddleName], [t0].[LastName], [t0].[EmailAddress], [t0].[EmailPromotion]
FROM [Person].[Contact] AS [t0]
WHERE ([t0].[FirstName] LIKE 'S%') AND ([t0].[LastName] LIKE 'K%')
ORDER BY [t0].[LastName]
FROM [Person].[Contact] AS [t0]
WHERE ([t0].[FirstName] LIKE 'S%') AND ([t0].[LastName] LIKE 'K%')
ORDER BY [t0].[LastName]
(4)再向QuerySyntax 的button中的event写入下面代码(Close button就是大家熟悉的退出程序)
Table<Contact> contact = context.GetTable<Contact>();
//QuerySyntax Restriction Operator
listBox1.Items.Add("_________________QuerySyntax Restriction Operator____");
var query1 = from c in contact where c.FirstName.StartsWith("S") select new { c.FirstName, c.LastName};
foreach (var q in query1)
{
listBox1.Items.Add(q.FirstName);
}
//QuerySyntax Restriction Operator
listBox1.Items.Add("_________________QuerySyntax Restriction Operator____");
var query1 = from c in contact where c.FirstName.StartsWith("S") select new { c.FirstName, c.LastName};
foreach (var q in query1)
{
listBox1.Items.Add(q.FirstName);
}
相信大家都是很熟悉的
(5)再向MethodSyntax写:
Table<Contact> contact = context.GetTable<Contact>();
//MethodSyntax uage Restriction Operator
listBox2.Items.Add("________________MethodSyntax uage Restriction Operator");
var methodQuery = contact.Select(c => new { c.FirstName, c.LastName }).Where(c => c.FirstName.StartsWith("S"));
foreach (var c in methodQuery)
{
listBox2.Items.Add(c.FirstName);
}
//MethodSyntax uage Restriction Operator
listBox2.Items.Add("________________MethodSyntax uage Restriction Operator");
var methodQuery = contact.Select(c => new { c.FirstName, c.LastName }).Where(c => c.FirstName.StartsWith("S"));
foreach (var c in methodQuery)
{
listBox2.Items.Add(c.FirstName);
}
我们分为QuerySyntax,MethodSyntax看上面你就知道,分别显示在ListBox1和ListBox2中,他们大多查询结果都是一样的,但并不所有查询结果都是一样的,不同的操作符号,具体分析.在右边的那一排按钮就触发不同的操作符在ListBoxs中输出值.还有一个按钮有多个相关的操作符号的操作在里面,如SelectMany里面就是Select和SelectMany!
(6)再看分级别的情况
分立即执行:读取数据源与操作一起执行,这样的操作符号返回一个值,这个值是非enumerable类型.
延迟执行:延迟执行就是在查询声明时,没有执行.当到在foreach中使用时才执行.这样返回值的类型为IEnumerable(T) 或 IOrderedEnumerable(TElement).
但延迟执行又分Streaming或non-streaming
------ Streaming:是指边读取数据边产生相应的元素.
------ Non-Streaming:读完数据后再产生元素.
表
Standard Query Operator |
Return Type |
Immediate Execution |
Deferred Streaming Execution |
Deferred Non-Streaming Execution |
---|---|---|---|---|
TSource |
X |
|
|
|
X |
|
|
||
X |
|
|
||
|
X |
|
||
Single numeric value |
X |
|
|
|
|
X |
|
||
|
X |
|
||
X |
|
|
||
X |
|
|
||
|
X |
|
||
|
X |
|
||
TSource |
X |
|
|
|
TSource |
X |
|
|
|
X |
|
|
||
|
X |
X |
||
TSource |
X |
|
|
|
TSource |
X |
|
|
|
|
|
X |
||
|
X |
X |
||
|
X |
X |
||
|
X |
X |
||
TSource |
X |
|
|
|
TSource |
X |
|
|
|
X |
|
|
||
Single numeric value, TSource, or TResult |
X |
|
|
|
Single numeric value, TSource, or TResult |
X |
|
|
|
|
X |
|
||
|
|
X |
||
|
|
X |
||
|
X |
|
||
|
X |
|
||
|
|
X |
||
|
X |
|
||
|
X |
|
||
X |
|
|
||
TSource |
X |
|
|
|
TSource |
X |
|
|
|
|
X |
|
||
|
X |
|
||
Single numeric value |
X |
|
|
|
|
X |
|
||
|
X |
|
||
|
|
X |
||
|
|
X |
||
TSource array |
X |
|
|
|
X |
|
|
||
X |
|
|
||
X |
|
|
||
|
X |
|
||
|
X |
|
还需要关注标准查询符对查询语法的支持
参照MSDN,但不是很全.它比较分散,下面是我自己统计的.
Standard QueryOperator |
C# | VB.NET |
All (Of T) | N/A(不适用) | Into All(. . .) |
Any | N/A(不适用) | Into Any() |
Average | N/A(不适用) | Into Averate() |
Cast (Of T) | An explicit range of variables | From. . .As. . . |
Count | N/A(不适用) | Into count() |
Distinct | N/A(不适用) | Distinct |
GroupBy |
group by | Group By |
GroupJoin | join. . .in. . .on. . .into. . | Group Join |
Join | join. . .in. . .on. . .equals |
Join. .As..IN. . .On. . |
LongCount |
N/A(不适用) | Into LongCount() |
Max | N/A(不适用) | Into Max() |
Min | N/A(不适用) | Into Min() |
OrderBy
|
orderby | Order By |
OrderByDescending | orderby desdending | Order By. . .Descending |
Select | select | Select |
SelectMany | Multiple from clauses | Multiple from clauses |
Skip | N/A (不适用) | Skip |
SkipWhile |
N/A(不适用) | Skip While |
Sum | N/A (不适用) | Into Sum |
Take | N/A(不适用) | Take |
TakeWhile | N/A (不适用) | Take While |
ThenBy | orderby | Order By |
ThenByDescending | orderby descending | Order By. . .Descending |
Where | where | Where |
worksguo
Standard Query Operators(2)