在本系列中。主要介绍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方法的更多相关文章

  1. LINQ体验(9)——LINQ to SQL语句之Insert/Update/Delete操作

    我们继续讲解LINQ to SQL语句,这篇我们来讨论Insert/Update/Delete操作.这个在我们的程序中最为常用了.我们直接看例子. Insert/Update/Delete操作 插入( ...

  2. LINQ体验(7)——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains

    我们继续讲解LINQ to SQL语句,这篇我们来讨论Group By/Having操作符和Exists/In/Any/All/Contains操作符. Group By/Having操作符 适用场景 ...

  3. LINQ体验(13)——LINQ to SQL语句之运算符转换和ADO.NET与LINQ to SQL

    运算符转换 1.AsEnumerable:将类型转换为泛型 IEnumerable 使用 AsEnumerable<TSource> 可返回类型化为泛型 IEnumerable 的參数.在 ...

  4. LINQ体验(18)——LINQ to SQL语句之视图和继承支持

    视图 我们使用视图和使用数据表类似,仅仅需将视图从"server资源管理器/数据库资源管理器"拖动到O/R 设计器上,自己主动能够创建基于这些视图的实体类.我们能够同操作数据表一样 ...

  5. LINQ体验(8)——LINQ to SQL语句之Union All/Union/Intersect和Top/Bottom和Paging和SqlMethods

    我们继续解说LINQ to SQL语句,这篇我们来讨论Union All/Union/Intersect操作和Top/Bottom操作和Paging操作和SqlMethods操作 . Union Al ...

  6. LINQ体验(6)——LINQ to SQL语句之Join和Order By

    Join操作 适用场景:在我们表关系中有一对一关系,一对多关系.多对多关系等.对各个表之间的关系,就用这些实现对多个表的操作. 说明:在Join操作中.分别为Join(Join查询), SelectM ...

  7. 在linq查询环境下通过sql语句来访问数据库

    接上一篇随笔 这里主要介绍在linq环境下,如果实现用sql来访问数据库,同时也介绍在EF框架中如何添加新的方法来访问数据库. 1.首先,在数据访问层(EF.DAO,EF.IDAO)中添加具体的函数来 ...

  8. mysql sql语句执行时是否使用索引检查方法

    在日常开发中,使用到的数据表经常都会有索引,这些索引可能是开发人员/DBA建表时创建的,也可能是在使用过程中新增的.合理的使用索引,可以加快数据库查询速度.然而,在实际开发工作中,会出现有些sql语句 ...

  9. Oracle之SQL语句性能优化(34条优化方法)

    (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处 ...

随机推荐

  1. System.AppDomain类详解(二)

    进程是存在独立的内存和资源的,但是AppDomain仅仅是逻辑上的一种抽象.一个process可以存在多个AppDomain.各个AppDomain之间的数据时相互独立的.一个线程可以穿梭多个AppD ...

  2. 从React看weight开发

    从当前云发展的势头来看几乎所有互联网应用都趋向大一统的趋势,一个node下面加一堆应用,同时我们项目也趋向把复杂的大应用拆分成多个小应用,通过各种复杂的Api来协作,通信,达到同样的效果. 可以看出, ...

  3. sublime 设置浏览器

    方法一: 1.安装sidebarenhancements插件 ctrl+shift+p —> Install Package —> 找到SideBarEnhancements 2.配置预览 ...

  4. taskctl命令行类(sh、exe、python新增scp)插件升级扩展

    转载自: http://www.taskctl.com/forum/detail_129.html 上次写了一个帖子 TASKCTL中不使用代理,通过ssh免密连接执行远程脚本配置(SSH插件扩展)h ...

  5. github与git常用的一些基本配置与命令

    首次Git设置:ssh-keygen -t ras -C "email@xxx" 生成SSH (共钥)将生成的SSH key复制到文本框中即可(title默认为邮箱名) 你的身份( ...

  6. 在iframe内页面完全加载完后,关闭父页面生成的div遮罩层

    遮罩层div为iframe父页面生成,需在iframe内页面完全加载完后,关闭遮罩层 alertMsgClose() :函数为关闭遮罩层函数 此段代码在iframe页面内: <script> ...

  7. swift 扩展 要素总结

    类: 协议: 泛型及元素类型:扩展约束:

  8. Windows提高_2.2第二部分:用户区同步

    第二部分:用户区同步 同步和互斥 同步:就是按照一定的顺序执行不同的线程 互斥:当一个线程访问某一资源的时候,其它线程不能同时访问 多线程产生的问题 #include <stdio.h> ...

  9. 新一代 Linux 文件系统 btrfs 简介

    https://www.ibm.com/developerworks/cn/linux/l-cn-btrfs/ Btrfs 简介 文件系统似乎是内核中比较稳定的部分,多年来,人们一直使用 ext2/3 ...

  10. php第二十三节课

    XML XML:页面之间传递数据,跨平台传递 HTML:超文本标记语言,核心标签 XML特点:1.标签名可以自己定义2.有且只有一个根3.大小写敏感4.标签必须完整 <!DOCTYPE html ...