Linq入门初探


  题记:今天是第一次写随笔,虽然用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或派生接口(如泛型 IQueryable

 

 我们类比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 desc 

分组 group   by into 

group 子句结束查询时,结果将以列表的形式列出。 列表中的每个元素都是具有 Key 成员的对象,列表中的元素根据该键被分组。 在循环访问生成组序列的查询时,必须使用嵌套 foreach 循环。 外层循环循环访问每个组,内层循环循环访问每个组的成员。
如果必须引用某个组操作的结果,可使用 into 关键字创建能被进一步查询的标识符
// queryCustomersByCity is an IEnumerable>
  var queryCustomersByCity =
      from cust in customers
      group cust by cust.City;

  // customerGroup is an IGrouping
  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>
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 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也是第一次接触,如果哪里描述的不对或者理解有偏差希望各位多多指点!!

参考文档:微软官方文档