[索引页]


大家好,谢谢来到这里!
上一次我们谈到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

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就是像方法调用样的来查询.两者可以混合在一起使用.
像这样:

     select num).Count();


二 准备


上几篇文章都是控制台,这一次我们玩windonw From
(1)界面:(不是很好看)
Standard Query Operators

使用数据库:AdventureWorks中[Person].[Contact]表
[HumanResources.Employee]表,[Sales.Individual]表,[Sales.Customer]表
(2)结构:

Standard Query Operators[Table(Name = "Person.Contact")]
Standard Query Operators        
public class Contact
        }
          DataContext context = new DataContext("Initial Catalog=AdventureWorks;Integrated Security=sspi");
    
Standard Query Operators

(3)ShowData中填写:
Standard Query OperatorsTable<Contact> contact = context.GetTable<Contact>();
Standard Query Operators
//QuerySyntax  Restriction Operator
Standard Query Operators
  var query = from c in contact
Standard Query Operators                        
where c.FirstName.StartsWith("S"&& c.LastName.StartsWith("K")
Standard Query Operators                        orderby c.LastName
Standard Query Operators                        select c;
Standard Query Operators
Standard Query Operators  
foreach (var item in query)
Standard Query Operators  listBox3.Items.Add(item.FirstName 
+ " " + item.LastName + " " + item.EmailAddress);         

这是上面查询的SQL
Standard Query OperatorsSELECT [t0].[Title][t0].[FirstName][t0].[MiddleName][t0].[LastName][t0].[EmailAddress][t0].[EmailPromotion]
Standard Query Operators
FROM [Person].[Contact] AS [t0]
Standard Query Operators
WHERE ([t0].[FirstName] LIKE 'S%'AND ([t0].[LastName] LIKE 'K%')
Standard Query Operators
ORDER BY [t0].[LastName]

(4)再向QuerySyntax 的button中的event写入下面代码(Close button就是大家熟悉的退出程序)

Standard Query OperatorsTable<Contact> contact = context.GetTable<Contact>();
Standard Query Operators            
Standard Query Operators            
//QuerySyntax  Restriction Operator
Standard Query Operators
            listBox1.Items.Add("_________________QuerySyntax  Restriction Operator____");
Standard Query Operators            
            }

相信大家都是很熟悉的

(5)再向MethodSyntax写:
Standard Query OperatorsTable<Contact> contact = context.GetTable<Contact>();
Standard Query Operators
Standard Query Operators            
//MethodSyntax uage Restriction Operator
Standard Query Operators
            listBox2.Items.Add("________________MethodSyntax uage Restriction Operator");


我们分为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

Aggregate

TSource

X

 

 

)

Boolean

X

 

 

Any

Boolean

X

 

 

)

)


X

 

Average

Single numeric value

X

 

 

)

)

 

X

 

)

)

 

X

 

Contains

Boolean

X

 

 

Count

Int32

X

 

 

DefaultIfEmpty

)

 

X

 

Distinct

)

 

X

 

)

TSource

X

 

 

)

TSource

X

 

 

)

)

X

 

 

Except

)


X

 X

First

TSource

X

 

 

FirstOrDefault

TSource

X

 

 

GroupBy

)

 

 

X

GroupJoin

)


X

Intersect

)


X

X

Join

)


X

X

Last

TSource

X

 

 

LastOrDefault

TSource

X

 

 

LongCount

Int64

X

 

 

Max

Single numeric value, TSource, or TResult

X

 

 

Min

Single numeric value, TSource, or TResult

X

 

 

)

)

 

X

 

OrderBy

)

 

 

X

OrderByDescending

)

 

 

X

Range

)

 

X

 

)

)

 

X

 

)

)

 

 

X

Select

)

 

X

 

SelectMany

)

 

X

 

SequenceEqual

Boolean

X

 

 

Single

TSource

X

 

 

SingleOrDefault

TSource

X

 

 

)

)

 

X

 

SkipWhile

)

 

X

 

Sum

Single numeric value

X

 

 

)

)

 

X

 

TakeWhile

)

 

X

 

ThenBy

)

 

 

X

ThenByDescending

)

 

 

X

)

TSource array

X

 

 

ToDictionary

)

X

 

 

)

)

X

 

 

ToLookup

)

X

 

 

Union

)

 

X

 

Where

)

 

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. .
OR
From x In..y.In..Where.

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)



相关文章: