阅读文章

LINQ体验(11)——LINQ to SQL语句之Null语义和String/DateTi

[日期:2008-02-25] 来源:  作者: [字体: ]

     在本系列中,主要介绍LINQ to SQL基础的东西,在上一篇中,听取了老赵的意见,为了避免初学者对于LINQ与LINQ to SQL这两个概念的误解,将本系列命名为LINQ体验系列之LINQ to SQL语句,注意一下请转载本系列的朋友相应的修改一下题目。因为LINQ太强大了,它对我们平常使用不同的数据源有着不同的内容,其包括对于SQL Server 数据库的LINQ to SQL;对于XML 文档的LINQ to XML;对于 ADO.NET 数据集的LINQ to DataSet;对于.NET 集合、文件、字符串等的LINQ to Objects。例外也出现了一些对LINQ支持的开源项目,例如LINQ to JSON,LINQ for NHibernate等等。在这个系列中,一些关于LINQ to SQL基础的东西就这么多了,这一篇用一些例子说明一下Null语义和String/DateTime方法。
  
  Null语义
  
  
  说明:下面第一个例子说明查询ReportsToEmployee为null的雇员。第二个例子使用Nullable<T>.HasValue查询雇员,其结果与第一个例子相同。在第三个例子中,使用Nullable<T>.Value来返回ReportsToEmployee不为null的雇员的ReportsTo的值。
  
  1.Null
  var q =
   from e in db.Employees
   where e.ReportsToEmployee == null
   select e;
  2.Nullable<T>.HasValue
  var q =
   from e in db.Employees
   where !e.ReportsTo.HasValue
   select e;
  3.Nullable<T>.Value
  var q =
   from e in db.Employees
   where e.ReportsTo.HasValue
   select new {e.FirstName, e.LastName, ReportsTo = e.ReportsTo.Value};
  String/Date Functions(字符串/日期方法)
  LINQ to SQL支持以下String方法。但是不同的是默认情况下System.String 方法区分大小写。而SQL则不区分大小写。
  
  1.String Concatenation
  var q =
   from c in db.Customers
   select new { c.CustomerID, Location = c.City + ", " + c.Country };
  
  这个例子使用了+操作符重新组合了顾客的区域。
  
  2.String.Length
  var q =
   from p in db.Products
   where p.ProductName.Length < 10
   select p;
  这个例子用Length属性来查询所有产品名称长度小于10的产品。
  
  3.String.Contains(substring)
  var q =
   from c in db.Customers
   where c.ContactName.Contains("Anders")
   select c;
  使用Contains方法查询联系人名称包含"Anders"所有的顾客。
  
  4.String.IndexOf(substring)
  var q =
   from c in db.Customers
   select new {c.ContactName, SpacePos = c.ContactName.IndexOf(" ")};
  这个实例说明ContactName第一个匹配项的索引有一个空格的顾客。
  
  下面两个实例说明ContactName以"Maria"开头,以"Anders"结尾的顾客。接下来的方法看看例子很快就明白了。
  
  5.String.StartsWith(prefix)
  var q =
   from c in db.Customers
   where c.ContactName.StartsWith("Maria")
   select c;
  6.String.EndsWith(suffix)
  var q =
   from c in db.Customers
   where c.ContactName.EndsWith("Anders")
   select c;
  7.String.Substring(start)
  var q =
   from p in db.Products
   select p.ProductName.Substring(3);
  8.String.Substring(start, length)
  var q =
   from e in db.Employees
   where e.HomePhone.Substring(6, 3) == "555"
   select e;
  9.String.ToUpper()
  var q =
   from e in db.Employees
   select new {LastName = e.LastName.ToUpper(), e.FirstName};
  10.String.ToLower()
  var q =
   from c in db.Categories
   select c.CategoryName.ToLower();
  11.String.Trim()
  var q =
   from e in db.Employees
   select e.HomePhone.Substring(0, 5).Trim();
  12.String.Insert(pos, str)
  var q =
   from e in db.Employees
   where e.HomePhone.Substring(4, 1) == ")"
   select e.HomePhone.Insert(5, ":");
  
  13.String.Remove(start)
  var q =
   from e in db.Employees
   where e.HomePhone.Substring(4, 1) == ")"
   select e.HomePhone.Remove(9);
  14.String.Remove(start, length)
  var q =
   from e in db.Employees
   where e.HomePhone.Substring(4, 1) == ")"
   select e.HomePhone.Remove(0, 6);
  15.String.Replace(find, replace)
  var q =
   from s in db.Suppliers
   select new {
   s.CompanyName,
   Country = s.Country.Replace("UK", "United Kingdom")
   .Replace("USA", "United States of America")
   };
  
  
  LINQ to SQL支持以下DateTime方法。但是,SQL Server和CLR的DateTime类型在范围和计时周期精度上不同,如下表。
  
  类型
   最小值
   最大值
   计时周期
  
  System.DateTime
   0001 年 1 月 1 日
   9999 年 12 月 31 日
   100 毫微秒(0.0000001 秒)
  
  T-SQL DateTime
   1753 年 1 月 1 日
   9999 年 12 月 31 日
   3.33… 毫秒(0.0033333 秒)
  
  T-SQL SmallDateTime
   1900 年 1 月 1 日
   2079 年 6 月 6 日
   1 分钟(60 秒)
  
  
  CLR DateTime 类型与SQL Server类型相比,前者范围更大、精度更高。因此来自SQL Server的数据用CLR类型表示时,绝不会损失量值或精度。但如果反过来的话,则范围可能会减小,精度可能会降低;SQL Server日期不存在TimeZone概念,而在CLR中支持这个功能。
  我们在LINQ to SQL查询使用以当地时间、UTC 或固定时间要自己执行转换。
  
  下面用三个实例说明一下。
  
  16.DateTime.Year
  var q =
   from o in db.Orders
   where o.OrderDate.Value.Year == 1997
   select o;
  17.DateTime.Month
  var q =
   from o in db.Orders
   where o.OrderDate.Value.Month == 12
   select o;
  18.DateTime.Day
  var q =
   from o in db.Orders
   where o.OrderDate.Value.Day == 31
   select o;
  
  
  作者:李永京(YJingLee's Blog)
  出处:http://lyj.cnblogs.com
  转载请注明此处,谢谢!
  
    


阅读:
录入:blue1000

评论 】 【 推荐 】 【 打印
上一篇:重提:上传图片生成略缩图“最佳解决”
下一篇:Rails框架流行在他的设计理念
相关文章      
本文评论
发表评论


点评: 字数
姓名:

  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款