专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » ejb3.0入门经典:C# 3.0入门系列( 4)-的Select操作 »正文

ejb3.0入门经典:C# 3.0入门系列( 4)-的Select操作

来源: 发布时间:星期二, 2009年2月17日 浏览:7次 评论:0
  先给关注dlinq朋友们道歉最近工作实在忙没有时间来写blog从本节开始我们讲dlinq语法咯我们先从select子句讲起看下面例子

  varq=
    fromcindb.Customers
    selectc.ContactName;


  这是个最简单dlinq查询语句查询得到联系人名字在这里我需要提醒下大家像这个语句只是个声明dlinq并没有真正把数据取出来只有当你需要该数据时候它才会帮你去取这就是延迟加载(deferred loading)如果你想在声明时候就希望dlinq帮你取到数据你可以使用ToList 或ToArray思路方法如上例

    varq=(fromcindb.Customers
        selectc.ContactName).ToArray;


  或     varq=(fromcindb.Customers
        selectc.ContactName).ToList;


  在这里我还要提醒大家dlinq返回结果集是对象集合不是数据

  在dlinq执行时候它会先将上面标准查询转换成dlinqAPI(也有人叫级连思路方法),比如下面语句

      varq=
        fromcindb.Customers
        wherec.City"London"
        selectc;


  就会先被转化成 var q = db.Customers.Where(c=>c.City "London").Select(c=>c); 也就是说这两个语句是等价而后dlinq会解析影射文件根据dlinqquery语句自动产生sql语句并把sql送到sql server服务器根据返回数据集创建相应对象在这里你可能会对c=>c感到非常陌生这是Lambda表达式(expression)你可以理解c为结果集里对象这对象类型是和你结果集里元素类型是这里理解起来可能困难我们起来理解下数据即是对象概念我相信这会帮我们理解Lambda表达式

  在dlinq的前在java领域有Hibernate在net领域有NHibernate技术来实现object/relational 持久和查询服务dlinq其实质上是在吸收了众多技术基础上比他们更加强大工具数据即对象含义有两层数据结构(表结构)即是类可以描述为Table Schema--Class第 2表里数据即是变量描述为Data--object(variable)那么我们在来理解Lambda表达式可能就容易些刚才我们已经说了var q = db.Customers.Where(c=>c.City "London").Select(c=>c);将会返回Customers对象集合也就说这个集合每个元素就是个CustomerLambda表达式是对c# 2.0中anonymous methods(匿名思路方法)扩展它更加简化匿名思路方法实现形式这里c是种隐式声明编译器会自动推断它实际类型也可以显示声明比如 var q = db.Customers.Where((Customer c) => c.City "London").ToList; Lambda表达式用=>符号跟随个表达式这个表达式需要返回个类型其实质就是个思路方法返回个类型它只是更加简洁匿名思路方法然后where等操作符用它返回这个类型做为参数有关Lambda表达式具体实现我会在进阶部分详细讲解这里不再赘述

  有点要提醒大家标准查询语句必须是select语句在最后而级连表达式各种操作符位置并不是很重要比如var q = db.Customers.Where(c=>c.City "London").Select(c=>c); 可以写成var q = db.Customers.Select(c=>c).Where(c=>c.City "London");它们两个是但是标准查询就不可以换位子select语句必须在最后虽然在级连表达式各种操作符位置并不是很重要但是他们还是有区别特别是在使用匿名类后区别很明显但万变不离其宗我们只要记住个操作符总是在上个操作符所筛选数据集基础上进行筛选这点我会在以后blog中更加详细介绍说明

  在select语句中个难点是匿名类比如列子

      varq=
        fromcindb.Customers
        select{c.ContactName,c.Phone};


  其实不光在select操作中有匿名类其他操作中也有让我们起来理解下匿名类上面语句和

  var q = db.Customers.Select(c=> {c,ContactName,c.Phone});是等价匿名类是c# 3.0中新出现特性其实质是编译器根据用户定义自动产生个匿名帮用户实现临时变量储存注意是临时变量大量使用匿名类会使可读性降低匿名类还依赖于另外个特性就是在c# 3.0可以支持根据property来创建对象比如有类

  publicPerson
  {
    privatename;
    publicName
    {
      get{name;}
      {name=value;}
    }
  }


  以前我们只可以用构造来创建其对象现在在3.0中支持用property来创建可以用

  var d = Person { Name = "s" }; 来创建对象在这里你可能还对var类型产生疑问你可能以为c#3.0和javascript样是弱类型其实var并不是c#3.0类型它是编译器关键字编译器根据实际变量返回类型自动推断类型那么var c = null; 是无法编译通过编译不知道null代表那个类型所以c#3.0还是强类型

  现在3.0可以支持用property来创建对象了那么就有了匿名类出现比如var d = { Name = "s" };编译器自动产生个有property叫做Name匿名类然后按这个类型分配内存化对象在这个地方还有个问题比如var d = { "s" };是编译不通过编译器不知道匿名类中property名字但是如果     c = "d";   var d = { c}; 则是可以通过编译编译器会创建个叫做匿名类带有叫cproperty



  在dlinq中比如 {c,ContactName,c.Phone});这里出现ContactName和Phone都是我们在影射文件中定义和表中字段相对应property编译器在取会数据并创建对象时会创建个匿名类这个类有两个属性为ContactName和Phone然后根据数据化对象匿名类还有另外种形式

      varq=
        fromeindb.Employees
        select{Name=e.FirstName+""+e.LastName,Phone=e.HomePhone};


  这种形式和第种区别编译器会重命名property名字当然也可以把两种形式组合起来       varq=
        frompindb.Products
        select{p.ProductID,HalfPrice=p.UnitPrice/2};


  第个属性名字不会变第 2个会被重新命名

  好就先讲这几个下节我会介绍几个更复杂使用方法



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: