LINQ体验(11)——LINQ to SQL语句之Null语义和String/DateTime方法
Posted brucemengbm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LINQ体验(11)——LINQ to SQL语句之Null语义和String/DateTime方法相关的知识,希望对你有一定的参考价值。
在本系列中。主要介绍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
返回前者的EmployeeID 编号。请注意.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 };
语句描写叙述:这个样例使用+运算符在形成经计算得出的客户Location值过程中将字符串字段和字符串串联在一起。
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(" ") };
语句描写叙述:这个样例使用IndexOf方法查找每一个客户联系人姓名中出现第一个空格的位置。
5.String.StartsWith(prefix)
var q = from c in db.Customers where c.ContactName.StartsWith("Maria") select c;
语句描写叙述:这个样例使用StartsWith方法查找联系人姓名以“Maria”开头的客户。
6.String.EndsWith(suffix)
var q = from c in db.Customers where c.ContactName.EndsWith("Anders") select c;
语句描写叙述:这个样例使用EndsWith方法查找联系人姓名以“Anders”结尾的客户。
7.String.Substring(start)
var q = from p in db.Products select p.ProductName.Substring(3);
语句描写叙述:这个样例使用Substring方法返回产品名称中从第四个字母開始的部分。
8.String.Substring(start, length)
var q = from e in db.Employees where e.HomePhone.Substring(6, 3) == "555" select e;
语句描写叙述:这个样例使用Substring方法查找家庭电话号码第七位到第九位是“555”的雇员。
9.String.ToUpper()
var q = from e in db.Employees select new { LastName = e.LastName.ToUpper(), e.FirstName };
语句描写叙述:这个样例使用ToUpper方法返回姓氏已转换为大写的雇员姓名。
10.String.ToLower()
var q = from c in db.Categories select c.CategoryName.ToLower();
语句描写叙述:这个样例使用ToLower方法返回已转换为小写的类别名称。
11.String.Trim()
var q = from e in db.Employees select e.HomePhone.Substring(0, 5).Trim();
语句描写叙述:这个样例使用Trim方法返回雇员家庭电话号码的前五位。并移除前导和跟随空格。
12.String.Insert(pos, str)
var q = from e in db.Employees where e.HomePhone.Substring(4, 1) == ")" select e.HomePhone.Insert(5, ":");
语句描写叙述:这个样例使用Insert方法返回第五位为 ) 的雇员电话号码的序列。并在 ) 后面插入一个 :。
13.String.Remove(start)
var q = from e in db.Employees where e.HomePhone.Substring(4, 1) == ")" select e.HomePhone.Remove(9);
语句描写叙述:这个样例使用Remove方法返回第五位为 ) 的雇员电话号码的序列,并移除从第十个字符開始的全部字符。
14.String.Remove(start, length)
var q = from e in db.Employees where e.HomePhone.Substring(4, 1) == ")" select e.HomePhone.Remove(0, 6);
语句描写叙述:这个样例使用Remove方法返回第五位为 ) 的雇员电话号码的序列,并移除前六个字符。
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") };
语句描写叙述:这个样例使用 Replace 方法返回 Country 字段中UK 被替换为 United Kingdom 以及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;
语句描写叙述:这个样例使用DateTime 的Year 属性查找1997 年下的订单。
17.DateTime.Month
var q = from o in db.Orders where o.OrderDate.Value.Month == 12 select o;
语句描写叙述:这个样例使用DateTime的Month属性查找十二月下的订单。
18.DateTime.Day
var q = from o in db.Orders where o.OrderDate.Value.Day == 31 select o;
语句描写叙述:这个样例使用DateTime的Day属性查找某月 31 日下的订单。
本系列链接:LINQ体验系列文章导航
以上是关于LINQ体验(11)——LINQ to SQL语句之Null语义和String/DateTime方法的主要内容,如果未能解决你的问题,请参考以下文章
LINQ体验——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains
LINQ体验——LINQ to SQL语句之Union All/Union/Intersect和Top/Bottom和Paging和SqlMethods