题记:今天是第一次写随笔,虽然用C#和.net 写过了不少的项目,但是今天忽然看见别人给一个标准的.net 程序猿规划的路线,Linq属于C#基础,可能因为工作中没有用到这方面的东西大部分都是在写T-SQL有关,所以抱着身为一个.net 程序员连这个常用都不会的心态,我尝试去窥探一下它
先来看看微软官方文档对于linq的定义吧:
查询是一种从数据源检索数据的表达式。 查询通常用专门的查询语言来表示。 随着时间的推移,人们已经为各种数据源开发了不同的语言;例如,用于关系数据库的 SQL 和用于 XML 的 XQuery。 因此,开发人员对于他们必须支持的每种数据源或数据格式,都不得不学习一种新的查询语言。 LINQ 通过提供处理各种数据源和数据格式的数据的一致模型,简化了这一情况。 在 LINQ 查询中,始终会用到对象。 可以使用相同的基本编码模式来查询和转换 XML 文档、SQL 数据库、ADO.NET 数据集、.NET 集合中的数据以及 LINQ 提供程序可用的任何其他格式的数据
我的理解:简单的来说,LInq 通过自己的语法 把多种数据源操作的多种语法整合成一种通用的语法 ,其实会SQL的小伙伴上手应该很快的
前提: 因为我们遍历对象是通过foreach ,所以我们的数据源必须实现IEnumerable 或 IEnumerable<T>或派生接口(如泛型 IQueryable<T>)
我们类比SQL进行学习,
from关键字,where 关键字,select 关键字
在 LINQ 查询中,先使用 from
子句引入数据源 (students
) 和范围变量 (stu
), stu相当于foreach的循环变量,我们不用去指定它的类型,编译器会自动推断 , where 跟筛选条件
和SQL语句 不同SQL 是select 在前 from 在后
1 var testquery = from stu in students where stu.ID>121 select stu; 2 // SQL = select * from students where ID>121
order by 关键字
和SQL语句相同 order by 放在 select 和 from 中,和SQL语句一致,可以根据多个字段排序,在order by 后面跟多个字段即可
var testquery1 = from stu in students where stu.ID > 121 orderby stu.ID descending select stu; // = select * from students where ID>121 order by ID descView Code
分组 group by into
group 子句结束查询时,结果将以列表的形式列出。 列表中的每个元素都是具有 Key 成员的对象,列表中的元素根据该键被分组。 在循环访问生成组序列的查询时,必须使用嵌套 foreach 循环。 外层循环循环访问每个组,内层循环循环访问每个组的成员。 如果必须引用某个组操作的结果,可使用 into 关键字创建能被进一步查询的标识符
// 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 循环。 外层循环循环访问每个组,内层循环循环访问每个组的成员。 如果必须引用某个组操作的结果,可使用 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;
联接:join 联接操作在不同序列间创建关联,这些序列在数据源中未被显式模块化。 例如,可通过执行联接来查找所有位置相同的客户和分销商。 在 LINQ 中,join
子句始终作用于对象集合,而非直接作用于数据库表。
与SQL不同的是 在LINQ中只有join 没有left join inner join right join 之分
var innerJoinQuery = from cust in customers join dist in distributors on cust.City equals dist.City select new { CustomerName = cust.Name, DistributorName = dist.Name };
标准写linq的两种方式:一种是标准查询语法 ,另一种是方法语法(方法调用的形式+上lambda表达式)
int[] numbers = { 5, 10, 8, 3, 6, 12}; //Query syntax:标准查询语法 IEnumerable<int> numQuery1 = from num in numbers where num % 2 == 0 orderby num select num; //Method syntax:方法语法 IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n);
查询的时候我们只需要某两个字段而不需要全部字段,我们可以使用匿名对象来实现
var newLargeOrderCustomers = from o in IncomingOrders where o.OrderSize > 5 select new { Name = o.Name, Phone = o.Phone };
总结:LINQ和SQL语句的语法大部分类似,我们可以通过对比进行学习,发现一个好东西,我们在使用linq的时候不必要每次用特定的类型变量去存储返回数据,例如 IEnumerable<Customer> customerQuery = from cust in customers where cust.City == "London" select cust;,我们完全可以把它改造成 var customerQuery = from cust in customers where cust.City == "London" select cust , 因为我们可能需要大量使用foreach 所以在foreach 里面也可以同样使用var 变量让编译器自行推断变量类型
我对LINQ也是第一次接触,如果哪里描述的不对或者理解有偏差希望各位多多指点!!
参考文档:微软官方文档