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

List < int >  numbers1  =   new  List < int > ()  5417,3,13,16,11,18986720,12, } ;
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");
    

(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);         

这是上面查询的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 ]

(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);
            }

相信大家都是很熟悉的

(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);
            }



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

 

 

All<(Of <(TSource>)>)

Boolean

X

 

 

Any

Boolean

X

 

 

AsEnumerable<(Of <(TSource>)>)

IEnumerable<(Of <(T>)>)


X

 

Average

Single numeric value

X

 

 

Cast<(Of <(TResult>)>)

IEnumerable<(Of <(T>)>)

 

X

 

Concat<(Of <(TSource>)>)

IEnumerable<(Of <(T>)>)

 

X

 

Contains

Boolean

X

 

 

Count

Int32

X

 

 

DefaultIfEmpty

IEnumerable<(Of <(T>)>)

 

X

 

Distinct

IEnumerable<(Of <(T>)>)

 

X

 

ElementAt<(Of <(TSource>)>)

TSource

X

 

 

ElementAtOrDefault<(Of <(TSource>)>)

TSource

X

 

 

Empty<(Of <(TResult>)>)

IEnumerable<(Of <(T>)>)

X

 

 

Except

IEnumerable<(Of <(T>)>)


X

 X

First

TSource

X

 

 

FirstOrDefault

TSource

X

 

 

GroupBy

IEnumerable<(Of <(T>)>)

 

 

X

GroupJoin

IEnumerable<(Of <(T>)>)


X

Intersect

IEnumerable<(Of <(T>)>)


X

X

Join

IEnumerable<(Of <(T>)>)


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

 

 

OfType<(Of <(TResult>)>)

IEnumerable<(Of <(T>)>)

 

X

 

OrderBy

IOrderedEnumerable<(Of <(TElement>)>)

 

 

X

OrderByDescending

IOrderedEnumerable<(Of <(TElement>)>)

 

 

X

Range

IEnumerable<(Of <(T>)>)

 

X

 

Repeat<(Of <(TResult>)>)

IEnumerable<(Of <(T>)>)

 

X

 

Reverse<(Of <(TSource>)>)

IEnumerable<(Of <(T>)>)

 

 

X

Select

IEnumerable<(Of <(T>)>)

 

X

 

SelectMany

IEnumerable<(Of <(T>)>)

 

X

 

SequenceEqual

Boolean

X

 

 

Single

TSource

X

 

 

SingleOrDefault

TSource

X

 

 

Skip<(Of <(TSource>)>)

IEnumerable<(Of <(T>)>)

 

X

 

SkipWhile

IEnumerable<(Of <(T>)>)

 

X

 

Sum

Single numeric value

X

 

 

Take<(Of <(TSource>)>)

IEnumerable<(Of <(T>)>)

 

X

 

TakeWhile

IEnumerable<(Of <(T>)>)

 

X

 

ThenBy

IOrderedEnumerable<(Of <(TElement>)>)

 

 

X

ThenByDescending

IOrderedEnumerable<(Of <(TElement>)>)

 

 

X

ToArray<(Of <(TSource>)>)

TSource array

X

 

 

ToDictionary

Dictionary<(Of <(TKey, TValue>)>)

X

 

 

ToList<(Of <(TSource>)>)

IList<(Of <(T>)>)

X

 

 

ToLookup

ILookup<(Of <(TKey, TElement>)>)

X

 

 

Union

IEnumerable<(Of <(T>)>)

 

X

 

Where

IEnumerable<(Of <(T>)>)

 

X

 




还需要关注标准查询符对查询语法的支持


参照MSDN,但不 是很全.它比较分散,下面是我自己统计的.




Standard QueryOperator


C#VB.NET
All (Of T)N/A(不适用)Into All(. . .)
AnyN/A(不适用)Into Any()
AverageN/A(不适用)Into Averate()
Cast (Of T)An explicit range of variablesFrom. . .As. . .
CountN/A(不适用)Into count()
DistinctN/A(不适用)Distinct
GroupBy
group byGroup By
GroupJoinjoin. . .in. . .on. . .into. . Group Join
Joinjoin. . .in. . .on. . .equals

Join. .As..IN. . .On. .
OR
From x In..y.In..Where.

LongCount

N/A(不适用)Into LongCount()
Max N/A(不适用)Into Max()
MinN/A(不适用)Into Min()
OrderBy

orderbyOrder By
OrderByDescendingorderby desdendingOrder By. . .Descending
Selectselect Select
SelectMany Multiple from clauses Multiple from clauses
SkipN/A (不适用)Skip
SkipWhile


N/A(不适用)Skip While
SumN/A (不适用)Into Sum
TakeN/A(不适用)Take
TakeWhileN/A (不适用)Take While
ThenByorderbyOrder By
ThenByDescendingorderby descendingOrder By. . .Descending
WherewhereWhere




worksguo



Standard Query Operators(2)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值