当前位置:主页   - 电脑 - 程序设计 - C#
LINQ体验(11)——LINQ to SQL语句之Null语义和String/DateTime方法
来源:网络   作者:   更新时间:2012-08-05
收藏此页】    【字号    】    【打印】    【关闭

  在本系列中,主要介绍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.Lengthvar 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.DateTime0001 年 1 月 1 日9999 年 12 月 31 日100 毫微秒(0.0000001 秒)
T-SQL DateTime1753 年 1 月 1 日9999 年 12 月 31 日3.33… 毫秒(0.0033333 秒)
T-SQL SmallDateTime1900 年 1 月 1 日2079 年 6 月 6 日1 分钟(60 秒)

  CLR DateTime 类型与SQL Server类型相比,前者范围更大、精度更高。因此来自SQL Server的数据用CLR类型表示时,绝不会损失量值或精度。但如果反过来的话,则范围可能会减小,精度可能会降低;SQL Server日期不存在TimeZone概念,而在CLR中支持这个功能。

  我们在LINQ to SQL查询使用以当地时间、UTC 或固定时间要自己执行转换。

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

  16.DateTime.Yearvar q =
  from o in db.Orders
  where o.OrderDate.Value.Year == 1997
  select o;

  语句描述:这个例子使用DateTime 的Year 属性查找1997 年下的订单。

  17.DateTime.Monthvar q =
  from o in db.Orders
  where o.OrderDate.Value.Month == 12
  select o;

  语句描述:这个例子使用DateTime的Month属性查找十二月下的订单。

  18.DateTime.Dayvar q =
  from o in db.Orders
  where o.OrderDate.Value.Day == 31
  select o;

  语句描述:这个例子使用DateTime的Day属性查找某月 31 日下的订单。

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明