当前位置:首页 > LINQ体验(11)——LINQ to SQL语句之Null语义和String/DateTime方法

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

点击次数:1083  更新日期:2010-12-30
\n

  在本系列中,主要介绍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方法。


\n

Null语义

\n

说明:下面第一个例子说明查询ReportsToEmployee为null的雇员。第二个例子使用Nullable<T>.HasValue查询雇员,其结果与第一个例子相同。在第三个例子中,使用Nullable<T>.Value来返回ReportsToEmployee不为null的雇员的ReportsTo的值。


\n

1.Null

var q =
\n from e in db.Employees
\n where e.ReportsToEmployee == null
\n select e;

\n

2.Nullable<T>.HasValue

var q =
\n from e in db.Employees
\n where !e.ReportsTo.HasValue
\n select e;

\n

3.Nullable<T>.Value

var q =
\n from e in db.Employees
\n where e.ReportsTo.HasValue
\n select new {e.FirstName, e.LastName, ReportsTo = e.ReportsTo.Value};

\n

String/Date Functions(字符串/日期方法)


\n

LINQ to SQL支持以下String方法。但是不同的是默认情况下System.String 方法区分大小写。而SQL则不区分大小写。


\n

1.String Concatenation

var q =
\n from c in db.Customers
\n select new { c.CustomerID, Location = c.City + “, ” + c.Country };
\n

\n

这个例子使用了+操作符重新组合了顾客的区域。


\n

2.String.Length

var q =
\n from p in db.Products
\n where p.ProductName.Length < 10
\n select p;

\n

这个例子用Length属性来查询所有产品名称长度小于10的产品。


\n

3.String.Contains(substring)

var q =
\n from c in db.Customers
\n where c.ContactName.Contains(“Anders”)
\n select c;

\n

使用Contains方法查询联系人名称包含”Anders”所有的顾客。


\n

4.String.IndexOf(substring)

var q =
\n from c in db.Customers
\n select new {c.ContactName, SpacePos = c.ContactName.IndexOf(” “)};

\n

这个实例说明ContactName第一个匹配项的索引有一个空格的顾客。


\n

下面两个实例说明ContactName以”Maria”开头,以”Anders”结尾的顾客。接下来的方法看看例子很快就明白了。


\n

5.String.StartsWith(prefix)

var q =
\n from c in db.Customers
\n where c.ContactName.StartsWith(“Maria”)
\n select c;

\n

6.String.EndsWith(suffix)

var q =
\n from c in db.Customers
\n where c.ContactName.EndsWith(“Anders”)
\n select c;

\n

7.String.Substring(start)

var q =
\n from p in db.Products
\n select p.ProductName.Substring(3);

\n

8.String.Substring(start, length)

var q =
\n from e in db.Employees
\n where e.HomePhone.Substring(6, 3) == “555″
\n select e;

\n

9.String.ToUpper()

var q =
\n from e in db.Employees
\n select new {LastName = e.LastName.ToUpper(), e.FirstName};

\n

10.String.ToLower()

var q =
\n from c in db.Categories
\n select c.CategoryName.ToLower();

\n

11.String.Trim()

var q =
\n from e in db.Employees
\n select e.HomePhone.Substring(0, 5).Trim();

\n

12.String.Insert(pos, str)

var q =
\n from e in db.Employees
\n where e.HomePhone.Substring(4, 1) == “)”
\n select e.HomePhone.Insert(5, “:”);
\n

\n

13.String.Remove(start)

var q =
\n from e in db.Employees
\n where e.HomePhone.Substring(4, 1) == “)”
\n select e.HomePhone.Remove(9);

\n

14.String.Remove(start, length)

var q =
\n from e in db.Employees
\n where e.HomePhone.Substring(4, 1) == “)”
\n select e.HomePhone.Remove(0, 6);

\n

15.String.Replace(find, replace)

var q =
\n from s in db.Suppliers
\n select new {
\n s.CompanyName,
\n Country = s.Country.Replace(“UK”, “United Kingdom”)
\n .Replace(“USA”, “United States of America”)
\n };

\n



LINQ to SQL支持以下DateTime方法。但是,SQL Server和CLR的DateTime类型在范围和计时周期精度上不同,如下表。


\n

\n


\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

\n

类型


\n

最小值


\n

最大值


\n

计时周期


\n

System.DateTime


\n

0001 年 1 月 1 日


\n

9999 年 12 月 31 日


\n

100 毫微秒(0.0000001 秒)


\n

T-SQL DateTime


\n

1753 年 1 月 1 日


\n

9999 年 12 月 31 日


\n

3.33… 毫秒(0.0033333 秒)


\n

T-SQL SmallDateTime


\n

1900 年 1 月 1 日


\n

2079 年 6 月 6 日


\n

1 分钟(60 秒)


\n

CLR DateTime 类型与SQL Server类型相比,前者范围更大、精度更高。因此来自SQL Server的数据用CLR类型表示时,绝不会损失量值或精度。但如果反过来的话,则范围可能会减小,精度可能会降低;SQL Server日期不存在TimeZone概念,而在CLR中支持这个功能。
我们在LINQ to SQL查询使用以当地时间、UTC 或固定时间要自己执行转换。


\n

下面用三个实例说明一下。


\n

16.DateTime.Year

var q =
\n from o in db.Orders
\n where o.OrderDate.Value.Year == 1997
\n select o;

\n

17.DateTime.Month

var q =
\n from o in db.Orders
\n where o.OrderDate.Value.Month == 12
\n select o;

\n

18.DateTime.Day

var q =
\n from o in db.Orders
\n where o.OrderDate.Value.Day == 31
\n select o;


\n

  作者:李永京(YJingLee’s Blog)
  出处:http://lyj.cnblogs.com

\n