zoukankan      html  css  js  c++  java
  • LINQ学习

    首先,不要2天打鱼,3天晒网,要坚持把这一个系列学完!立贴作为警示!

    1.函数编程,像SQL,它只需要你告诉它要什么,而不需要你告诉它怎么做;而C#,命令式编程,你必须像命令一样告诉你的机器 该怎么做。

    2.delegate用于定义委托 。。。委托不是很明白,快下班了,回家看!

    3.各种数据源有不同的查询语言,例如用于关系数据库的SQL和用于XML的XQUERY

    4.所有LINQ查询操作都由三个不同的操作组成:①获取数据源②创建查询③执行查询;如果只是创建查询语句,则不会检索任何数据;from子句指定数据源,where子句应用筛选器,select指定返回的元素的类型;在LINQ中,查询变量本身不会执行任务操作并且不返回任何数据。它只是存储在以后某个时刻执行查询时为生成结果而必要的信息。

    5.延迟执行:查询变量本身只是存储查询命令。实际的查询执行会延迟到在 foreach 语句中循环访问查询变量时发生。

    6.强制立即执行:若要强制立即执行任意查询并缓存其结果,可以调用 ToList<(Of <(TSource>)>)ToArray<(Of <(TSource>)>) 方法。还可以通过在紧跟查询表达式之后的位置放置一个 foreach 循环来强制执行查询 。

    7.LINQ查询基于泛型类型。泛型集合易于使用的原因是您不必执行运行时类型强制转换。LINQ 查询中的 IEnumerable 变量

    代码
    IEnumerable<Customer> customerQuery =
    from cust 
    in customers
    where cust.City == "London"
    select cust;

    foreach (Customer customer in customerQuery)
    {
    Console.WriteLine(customer.LastName 
    + "" + customer.FirstName);
    }

    让编译器处理泛型类型声明

    代码
    var customerQuery2 = 
    from cust 
    in customers
    where cust.City == "London"
    select cust;

    foreach(var customer in customerQuery2)
    {
    Console.WriteLine(customer.LastName 
    + "" + customer.FirstName);
    }

    当变量的类型明显或显式指定嵌套泛型类型(如由组查询生成的那些类型)并不重要时,var 关键字很有用。通常,我们建议如果您使用 var,应意识到这可能使您的代码更难以让别人理解。

    8.LINQ查询步骤:

    ①指定数据源。

      像在大多数编程语言中一样,在 C# 中,必须先声明变量,才能使用它。在 LINQ 查询中,最先使用 from 子句的目的是引入数据源 (customers) 和范围变量 (cust)。

    var queryAllCustomers = from cust in customers 
                            select cust;

    范围变量类似于 foreach 循环中的迭代变量,但在查询表达式中,实际上不发生迭代。执行查询时,范围变量将用作对 customers 中的每个后续元素的引用。因为编译器可以推断 cust 的类型,所以您不必显式指定此类型。其他范围变量可由 let 子句引入。

    ②筛选。

      也许最常用的查询操作是应用布尔表达式形式的筛选器。此筛选器使查询只返回那些表达式结果为 true 的元素。使用 where 子句生成结果。实际上,筛选器指定从源序列中排除哪些元素。在下面的示例中,只返回那些地址位于伦敦的 customers。

    var queryLondonCustomers = from cust in customers where cust.City == "London" select cust;

    您可以使用熟悉的 C# 逻辑 AND 和 OR 运算符来根据需要在 where 子句中应用任意数量的筛选表达式。例如,若要只返回位于“伦敦”AND 姓名为“Devon”的客户,您应编写下面的代码:

    where cust.City=="London" && cust.Name == "Devon"

    若要返回位于伦敦或巴黎的客户,您应编写下面的代码:

    where cust.City == "London" || cust.City == "Paris"

    ③排序

      通常可以很方便地将返回的数据进行排序。orderby 子句将使返回的序列中的元素按照被排序的类型的默认比较器进行排序。例如,下面的查询可以扩展为按 Name 属性对结果进行排序。因为 Name 是一个字符串,所以默认比较器执行从 A 到 Z 的字母排序。

    var queryLondonCustomers3 =  from cust in customers where cust.City== "London"                  
                                 orderby cust.Name ascending 
                     select cust;

    若要按相反顺序(从 Z 到 A)对结果进行排序,请使用 orderby…descending 子句。

    ④分组

      使用 group 子句,您可以按指定的键分组结果。例如,您可以指定结果应按 City 分组,以便位于伦敦或巴黎的所有客户位于各自组中。在本例中,cust.City 是键。

    代码
    // 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;

    ⑤联接

     联接运算创建数据源中没有显式建模的序列之间的关联。例如,您可以执行联接来查找符合以下条件的所有客户:位于巴黎,且从位于伦敦的供应商处订购产品。在 LINQ 中,join 子句始终针对对象集合而非直接针对数据库表运行。在 LINQ 中,您不必像在 SQL 中那样频繁使用 join,因为 LINQ 中的外键在对象模型中表示为包含项集合的属性。例如,Customer 对象包含 Order 对象的集合。不必执行联接,只需使用点表示法访问订单:

    from order in Customer.Orders...

     9.DataContext类型是system.Data.Linq命名空间下的重要类型,用于把查询语句翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入数据库。

    DataContext的功能:①以日志形式记录DataContex生成的SQL:

    NorthwindDataContext ctx = new NorthwindDataContext("server=xxx;database=Northwind;uid=xxx;pwd=xxx");

    StreamWriter sw = new StreamWriter(Server.MapPath("log.txt"), true); // Append

    ctx.Log = sw;

    GridView1.DataSource = from c in ctx.Customers where c.CustomerID.StartsWith("A") select new { 顾客ID = c.CustomerID, 顾客名 = c.Name, 城市 = c.City };

    GridView1.DataBind();

    sw.Close();

    ②执行SQL(包括查询和更新语句)

    NorthwindDataContext ctx = new NorthwindDataContext("server=xxx;database=Northwind;uid=xxx;pwd=xxx");

    string newcity = "Shanghai";

    ctx.ExecuteCommand("update Customers set City={0} where CustomerID like 'A%'", newcity);

    IEnumerable<Customer> customers = ctx.ExecuteQuery<Customer>("select * from Customers where CustomerID like 'A%'");

    GridView1.DataSource = customers;

    GridView1.DataBind();

    ③创建和删除数据库

    10.Count/Sum/Min/Max/Avg操作符不延迟

    11.Join操作符:分别为Join(Join查询),SelectMany(Select一对多选择)和GroupJoin(分组Join查询)。

    12.insert一对多关系表时一定要设置好表的关系(主外键),否则无法实现

    本文知识主要参考于http://kb.cnblogs.com/zt/linq/博客园LINQ专题,再次感谢博客园

  • 相关阅读:
    『空』
    退役前的做题记录 Ⅰ
    BZOJ3600 没有人的算术(替罪羊树,线段树)
    洛谷P5324 [BJOI2019]删数(线段树)
    洛谷P4696 [CEOI2011]Matching(KMP)
    Leetcode 638 大礼包 DP
    Leetcode 86 分割链表
    Leetcode 71 简化路径
    Leetcode 17.15 最长单词 剪枝与记忆化
    Leetcode 17.22单词转换 dfs+回溯+剪枝
  • 原文地址:https://www.cnblogs.com/yinpeng186/p/1682629.html
Copyright © 2011-2022 走看看