[索引页]

谢谢来访!上一次我们谈到LINQ to DataSet
这一次我们谈的是C#查询keywords,就是大家熟悉的在LINQ中的from,group,select,into,where.可能会大家感觉有点长, 但是比较基础的,你懂的可以一扫而过!
还有提供LINQ的三工具的下载!就大家知道的linqpad,QueryVisualizer插件,VLinq可视化编辑器.!
请多指正!

C# 查询keywords

LINQ Query Keywords


我知道的关于LINQ的工具
linqpad: http://www.linqpad.net/
QueryVisualizer:http://www.scottgu.com/blogposts/linqquery/
SqlServerQueryVisualizer.zip
VLinq:http://code.msdn.microsoft.com/vlinq


From


from:一个查询表达式的开始,如果有子查询也由它开始,指向数据源.有一个本地范围变量(range variable)来表示来源数据.他们都是强类型的.而这里的from引用的数据源必须有一个IEnumerable, IEnumerable(T)类型,或IQueryable(T).

这里提到的范围变量,就是编译器可以在当数据源实现IEnumerable(T)类型时推断这个范围变量的类型,如果源数据已有类型为IEnumerable(T),之后这个范围变量就在会被使用时推断变量类型.这里如果你的源数据没有指定泛性的IEnumerable类型,那你只有明确的指定变量类型.

下面是使用LINQ查寻ArrayList,
数据源
                );

LINQ Query Keywords//Use an explicit type for non-generic collections,and query it
LINQ Query Keywords
            var query = from Student student in arrList
              where
 student.Scores[0> 90 select student;
LINQ Query Keywords             
foreach (Student s in query)
            Console.ReadLine();

在上面就使用非泛性的IEnumerable类型的集合ArrayList,你必须明确的指定类型,在这里from Student student,就指定类型!明确指定范围变量(range variable)就同调用Cast(TResult)方法一样的效果.Cast(TResult)和OfType(TResult)都操作非泛性IEnumberable类型的标准操作符.

以前我们谈过关于IEnumerable(T),所以只看泛性形式是怎样写的(就是大家熟悉的这个事例)
LINQ Query Keywordsclass LINQQueryExpressions
}


接下来我们再看是Cast(TResult)方法
它转换IEnumerable类型的元素为指定类型.他的返回类型为IEnumerable(T).其实这个方法要被延迟执行的,就是延迟到foreach使用它时候才被执行,没有被激活时返回Object里面放有所有在被激活时所有需要的所有信息.Cast(TResult)方法可以让一些不能实现IEnumerable(T)类型的类进行转换,如果ArrayList!看下面实现:
LINQ Query KeywordsConsole.WriteLine("use generic IEnumerable collections");
LINQ Query Keywords            IEnumerable
<Student> query2 =
                    arrList.Cast
<Student>().Select(arrLists => arrLists);
LINQ Query Keywords            
foreach (Student s in query2)
            Console.ReadLine();
比较简单!

而因为Cast(TResult)只能简单转化类型的但是如果在它集合里面有不转换的它就会抛出一个异常,只不过这里我们可以使用OfType(TResult)方法来过滤不被传换的,而不用抛出一个异常!
LINQ Query Keywords //use Cast<T>() method
LINQ Query Keywords
            Console.WriteLine("use Cast<T>() method");
LINQ Query Keywords            ArrayList fruits 
= new ArrayList();
LINQ Query Keywords            fruits.Add(
"apple");
LINQ Query Keywords            fruits.Add(
"mango");
LINQ Query Keywords
LINQ Query Keywords            IEnumerable
<string> query3 =
                fruits.Cast
<string>().Select(fruit => fruit);
LINQ Query Keywords            
foreach (string fruit in query3)
            Console.ReadLine();

OfType(TResult)方法
基于指定类型的来过滤IEnumerable的元素.返回一个IEnumerable(T).它也同样要被延迟的.这个方法适合应用在非参数化类型的集合中,如ArrayList,因为OfType(TResult)方法扩展类型为IEnumerable.OfType(TResult)不能应用于参数化集合中IEnumerable(T).
LINQ Query Keywords //OfType<T>() method
LINQ Query Keywords
            Console.WriteLine("OfType<T>() method");
LINQ Query Keywords            ArrayList fruits2 
= new ArrayList(4);
LINQ Query Keywords            fruits2.Add(
"Mango");
LINQ Query Keywords            fruits2.Add(
"Orang2");
LINQ Query Keywords            fruits2.Add(
"Apple2");
LINQ Query Keywords            fruits2.Add(
3.0);
LINQ Query Keywords            fruits2.Add(
"Banana2");
LINQ Query Keywords
LINQ Query Keywords            IEnumerable
<string> query4 = fruits2.OfType<string>();
LINQ Query Keywords
LINQ Query Keywords            Console.WriteLine(
"Elements of type 'string' are:");
LINQ Query Keywords
LINQ Query Keywords            
foreach (string fruit in query4)

              fruits2.OfType
<string>().Where(fruit => fruit.ToLower().Contains("n"));
LINQ Query Keywords
LINQ Query Keywords            Console.WriteLine(
"\nThe following strings contain 'n':");
LINQ Query Keywords            
foreach (string fruit in query5)
         

上面是过滤了不能转换成指定类的项,第二个查寻是将arraylist中包括得有字符'n'每一项输出.

接下来是多个from的内连查询
LINQ Query Keywords ArrayList fruits1 = new ArrayList(2);
LINQ Query Keywords            fruits1.Add(
"apple");
LINQ Query Keywords            fruits1.Add(
"Mango");
LINQ Query Keywords            var query7 
= from string fur in fruits1
LINQ Query Keywords                         
where fur!="apple"
LINQ Query Keywords                         from 
string fur2 in fruits2
LINQ Query Keywords                         
where  fur2 != "Mango"
            Console.ReadKey();



二Where,select



(1)Where:这个与SQL基本没什么不同,起一个过滤作用,能使用在group之前或之后.
(2)select:而select也基本一样,这里select是指定range variable详细信息,还有一个作用就是指定query variable(这个就在LINQ中的一般查寻的结构能看懂吧:var query variable = from string range variable in myName select range variable).


三group


Group返回的是一个IGrouping(TKey, TElement)的有序对象包括0个或更多个匹配分组的键值的项.
我们需要先知道IGrouping(TKey, TElement);

LINQ Query Keywordspublic interface IGrouping <TKey,TElement> : IEnumerable<TElement>,
LINQ Query Keywords                                             IEnumerable
}

参数:
TKey:是在IGrouping(TKey, TElement)中key的类型,
TElement:在IGrouping(TKey, TElement)中值的类型

IGrouping(TKey, TElement)是一个IEnumerable(T)多加一个Key,而这个key在这个里面是属性,也是这个里面每一个值都有的共同的这个属性,这个key我们可以指定实体中任何存在的值.当然也可以是任何类型.下面的事例来于MSDN中的,就反射String对象中的成员,我们再将这些成员按Key分组输出.(你可以把 First()方法换成Last方法来调试,你就知道Group关键是指定这个Key).
LINQ Query Keywords//use IGroup
LINQ Query Keywords
            IGrouping<MemberTypes, MemberInfo> group =
typeof(String).GetMembers().GroupBy(member => member.MemberType).First();
LINQ Query Keywords            Console.WriteLine(
"\nValues that have the key'{0}':", group.Key);
LINQ Query Keywords            
foreach (MemberInfo mi in group)
LINQ Query Keywords                Console.WriteLine(mi.Name);
LINQ Query Keywords            Console.ReadKey();


因为IGrouping(TKey, TElement)对象由group产生,实质就是一个List,所以你必须使用foreach.而且在执行时是keySelector和ElementSelector同时存在。
这里运行时的IL
elementSelector =
 {System.Func<CSharpLanguage_C_app.LinqAPP.Linqkey.keyWord2.Student,
CSharpLanguage_C_app.LinqAPP.Linqkey.keyWord2.Student>}
base {System.Delegate} = {System.Func<CSharpLanguage_C_app.LinqAPP.Linqkey.keyWord2.Student,
CSharpLanguage_C_app.LinqAPP.Linqkey.keyWord2.Student>}

keySelector = {System.Func<CSharpLanguage_C_app.LinqAPP.Linqkey.keyWord2.Student,char>}
base {System.MulticastDelegate} = {System.Func<CSharpLanguage_C_app.LinqAPP.Linqkey.keyWord2.Student,char>}
base {System.Delegate} = {System.Func<CSharpLanguage_C_app.LinqAPP.Linqkey.keyWord2.Student,char>}

回到我们的Group中来看代码,
数据源:
        }

一般的使用
LINQ Query KeywordsList<Student> students = GetStudents();
LINQ Query Keywords
LINQ Query Keywords            var booleanGroupQuery 
= from student in students
                                                  group student by student.Scores.Average() 
>= 80;
LINQ Query Keywords
LINQ Query Keywords            
foreach (var studentGroup in booleanGroupQuery)

                                                ==
 true ? "High averages" : "Low averages");
LINQ Query Keywords                
foreach (var student in studentGroup)
,
                         student.Last, student.First, student.Scores.Average());
LINQ Query Keywords                }

LINQ Query Keywords            }

key可以是任何值
LINQ Query Keywordsvar studentQuery2 = from student in students
LINQ Query Keywords                                let avg 
= (int)student.Scores.Average()
LINQ Query Keywords                                group student by (avg 
== 0 ? 0 : avg / 100) into g
LINQ Query Keywords                                orderby g.Key
LINQ Query Keywords                                select g;
LINQ Query Keywords
LINQ Query Keywords            
foreach (var studentGroup2 in studentQuery2)
,
                                            temp, temp 
+ 10);
LINQ Query Keywords                
foreach (var student in studentGroup2)
,
                 student.Last, student.First, student.Scores.Average());
LINQ Query Keywords                }

LINQ Query Keywords            }

还可以使用匿名类创建混合的KEY.

LINQ Query Keywords// Composite Keys
 students
                                group f by 
new             }

IGrouping<key,Element>得用法
LINQ Query Keywords//usage IGrouping<key,Element>
LINQ Query Keywords
    IEnumerable<IGrouping<char, Student>> studentQuery4 =
                                                                    from student 
in students
LINQ Query Keywords                                                                  group student by student.Last[
0];
LINQ Query Keywords            
foreach (IGrouping<char, Student> group in studentQuery4)
            }




Into


Into就是创建一个暂时标识来保存经过selelct, group,join等处理过的数据.
LINQ Query KeywordsArrayList fruits2 = new ArrayList(4);
LINQ Query Keywords            fruits2.Add(
"Mango");
LINQ Query Keywords            fruits2.Add(
"Orang2");
LINQ Query Keywords            fruits2.Add(
"Apple2");
LINQ Query Keywords            fruits2.Add(
3.0);
LINQ Query Keywords            fruits2.Add(
"Banana2");
LINQ Query Keywords
LINQ Query Keywords ArrayList fruits1 
= new ArrayList(2);
LINQ Query Keywords            fruits1.Add(
"apple");
LINQ Query Keywords            fruits1.Add(
"Mango"); 
LINQ Query Keywords
//keyWord into
LINQ Query Keywords
 
LINQ Query Keywords            var wordGroup1 
= from string f in fruits2 
LINQ Query Keywords                             group f by f[
0] into  fruitsGroup 
LINQ Query Keywords                             
where fruitsGroup.Count()>=1
 fruitsGroup.Key,
                                                Words 
= fruitsGroup.Count()};
LINQ Query Keywords            
foreach (var item in wordGroup1)
]
                                        into fruitsGroups
                                        select fruitsGroups.Key;
LINQ Query Keywords        
LINQ Query Keywords            
foreach (var item in fruitsCount)
        Console.ReadKey();


orderby


orderby用来排序,指定一个key,按照这个key来排序,指定多个Key,就能出现多级别排序!在标准的查操作符,有

OrderBy,ThenBy          升序
OrderByDescending,ThenByDescending 降序
Reverse    反转

返回类型 IOrderedEnumerable<TSource>

这里我们要来谈谈IOrderedEnumerable(TElement)接口

它表示一个排序,OrderBy,ThenBy 都是扩展它。
public interface IOrderedEnumerable<TElement> : IEnumerable<TElement>,
    IEnumerable

一个IOrderedEnumerable(TElement)的对象能通过调用第一级OrderBy或OrderByDescending排序方法获得,而输入的参数是IEnumerable<TSource>,返回一个IOrderedEnumerable(TElement). ThenBy and ThenByDescending,是子级排序方法,输入的参数类型IOrderedEnumerable(TElement)为还是返回的IOrderedEnumerable(TElement).

LINQ Query KeywordsIEnumerable<string> sortAscendingQuery = from string f in fruits2 orderby f
                                                             select f;
LINQ Query Keywords        
foreach(string s in sortAscendingQuery)
 fruits2
                                                                     orderby f descending select f;
LINQ Query Keywords
foreach (string s in sortDescendingQuery)
        Console.ReadKey();





Join以后会单独谈,let在之前已经谈到!



worksguo

相关文章: