• [Linq]Linq To Sql (3)


    2012.7.8参照MSDN帮助学习了Linq的几个知识点,慢慢加深了对Linq的原理的理解,真心觉得 MSDN帮助才是经常该看的东西,而不是某些一知半解书店卖的书。

    Linq 相当于ADO.NET 的sqlconnection

    1. Foreach中的数据源必须继承自  IEnumberable<T> 或者派生接口Iquerable<T>

       才可以用foreach   (var  a  in   数据源)

      自定义类,实现可以使用Foreach 循环。

    1)类支持Ienumerable, 然后 public IEnumerator GetEnumberator()   返回每个子成员

    class People : IEnumerable
       {
           private Person[] _people;
           public People(Person[] pep)
           {
               _people = new Person[pep.Length];
     
               for (int i = 0; i < pep.Length; i++)
               {
     
                   _people[i] = pep[i];
               }
     
     
           }
     
     
           public IEnumerator GetEnumberator()
           {
               return new PeopleEnum(_people);
     
     
           }
     
     
       }
     
       public class PeopleEnum : IEnumerator
       {
           public Person[] _people;
     
           // Enumerators are positioned before the first element
           // until the first MoveNext() call.
           int position = -1;
     
           public PeopleEnum(Person[] list)
           {
               _people = list;
           }
     
           public bool MoveNext()
           {
               position++;
               return (position < _people.Length);
           }
     
           public void Reset()
           {
               position = -1;
           }
     
           public object Current
           {
               get
               {
                   try
                   {
                       return _people[position];
                   }
                   catch (IndexOutOfRangeException)
                   {
                       throw new InvalidOperationException();
                   }
               }
           }
       }

       2. Linq 延迟查询,即刻查询

         

             默认延迟查询。

            即刻查询: 查询语句加上 .ToList()  或者 .ToArray   (或者后面直接紧接着foreach)

    int[] numbers = new int[100];
               for (int i = 1; i <= 100; i++)
               {
                   numbers[i-1] = i;
               }
     
               //查询偶数-延迟查询
               var queryFirst = from n in numbers
                                where (n % 2) == 0
                                select n;
     
               foreach (var a in queryFirst)
               {
                   Write(a);
               }
     
     
               //立即查询,并保存在结果集中 Tolist,toARRAY
               List<int> querySeconde = (from n in numbers
                                where (n % 2) == 0
                                select n).ToList();
     
     
               var queryThird = (from n in numbers
                                 where (n % 2) == 0
                                 select n).ToArray();

    3.  Linq 调用存储过程,执行4个基本操作(插入,删除,更新)

        1) O/R设计器 ,创建映射到数据库表和视图的实体类

                创建调用存储过程和函数的 DataContext 方法  (拖放存储过程到 O/R)

        image

             

              image

    查看 xx.dbml 中的design.cs可以看见自动添加了  映射到 存储过程和函数的方法和相关类

    [Function(Name="dbo.addWenJuan")]
    public ISingleResult<addWenJuan_个结果> addWenJuan([Parameter(Name="WenJuanTitle", DbType="VarChar(200)")] string wenJuanTitle, [Parameter(Name="WenJuanContext", DbType="VarChar(8000)")] string wenJuanContext)
    {
        IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), wenJuanTitle, wenJuanContext);
        return ((ISingleResult<addWenJuan_个结果>)(result.ReturnValue));
    }
     
    [Function(Name="dbo.f_split", IsComposable=true)]
    public IQueryable<f_split_个结果> f_split([Parameter(Name="SourceSql", DbType="VarChar(8000)")] string sourceSql, [Parameter(Name="StrSeprate", DbType="VarChar(10)")] string strSeprate)
    {
        return this.CreateMethodCallQuery<f_split_个结果>(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), sourceSql, strSeprate);
    }

    调用存储过程:

    //自定义存储过程 CustomersByCityResult,并调用
              ISingleResult<CustomersByCityResult_个结果> result = northwindDataContext.CustomersByCityResult("London");
              foreach (var a in result)
              {
     
                  Console.WriteLine("{0}-{1}-{2}-{3}",a.CustomerID,a.CompanyName,a.Contactname,a.city);
              }

    ------------------------------------------------------------------------------------------

    另外(与Linq 无关):可以根据现有数据表,通过数据字典自动创建存储过程。

      项目名字--->新建项----》数据==》数据集 (.xsd)

    image

    image

    双击项目中的XX.XSD文件--》

    image

    右击==》配置

    image

    image

    然后就可以根据数据表自动创建好 4个存储过程,insert,update,select,delete

    -------------------------------------------------------------------------------------------

    4. Linq  更新,删除,修改,insert

       

    //执行更新,插入,删除
                Customers cus = (from c in northwindDataContext.Customers
                                 select c).First();
     
     
                Write("更改前name: "+cus.ContactName+"");
     
                cus.ContactName = " dll";
     
                Write("更改后name: " + cus.ContactName + ""); //此时只修改了内存中的值,数据库中的值并未更改
                Orders ord = new Orders();
                ord.OrderDate = DateTime.Now;
                cus.Orders.Add(ord);
     
                Orders ddd = cus.Orders[0];  //cus的第1个订单
                //northwindDataContext.Orders.DeleteOnSubmit(ddd);
                try
                {
                    northwindDataContext.SubmitChanges();
                }
                catch (Exception exx)
                {
                    Write(exx.Message);
                }
                finally
                {
     
                }

    submitchanges()才生效。  deleteonsubmit 只是把状态变成deleted,但是没提交

    直接执行sql命令   db.ExecuteCommand("UPDATE Products SET UnitPrice = UnitPrice + 1.00");

    和ADO.NET共用sqlconnection,直接赋值相同sqltransaction

  • 相关阅读:
    怎么卸载Apache_pn服务PHPnow使用问题
    没有该栏目数据 可能缓存文件(data/cache/inc_catalog_base.inc)没有更新请检查是否有写入权限
    用css实现网页背景渐变
    为页面添加正确的doctype声明W3C标准
    js:全部替换的函数,用正则表达式解决,js的全部替换
    真够剽悍的——读罗永浩《我的奋斗》
    Auto你的IT——AutoIt是啥?
    书评:软件设计精要与模式
    程序员应知——破窗与童子军军规
    开发人员用的提交测试环境的AutoIT脚本
  • 原文地址:https://www.cnblogs.com/StudyLife/p/2581263.html
Copyright © 2020-2023  润新知