【LINQ】Linq to SQL -- Select语句
简介
# 作用:查询
# 说明:和SQL命令中的select作用相似,但位置不同。查询表达式中的select及所接句子是放在表达式最后,并把句子中的变量也就是结果返回回来;延迟。
# 9种形式:Select/Distinct操作包括????简单用法、 匿名类型形式、条件形式、指定类型形式、筛选形式、整形类型形式、 嵌套类型形式、本地方法调用形式、Distinct形式 这9种。
举例
一、简单用法
1、返回仅含学生姓名的序列
var n =
from c in db.Students
select c.StudentName;
注意:这个语句只是一个声明或者一个描述,并没有真正把数据取出来。只有当你需要这个数据的时候,它才会执行这个语句,这就是延迟加载(deferred loading).
如果在声明的时候就返回的结果集是对象的集合,可以使用ToList()或者ToArray()方法把查询结果先进行保存,然后再对这个集合进行查询。当然,延迟加载(deferred loading)可以像拼接SQL语句那样拼接查询语法,再执行它。
二、匿名类型形式
2、使用select和匿名类型返回仅含客户联系人姓名和电话号码的序列
var n =
from c in db.Customers
select new { c.ContactName, c.Phone};
说明:匿名类型是C# 3.0中新特性。其实质是编译器根据我们自定义自动产生一个匿名的类来帮助我们实现临时变量的存储。匿名类型还依赖于另外一个特性:支持根据property来创建对象。比如:var n =new { Name = " s "}; 编译器自动产生一个有property叫做Name的匿名类,然后按这个类型分配内存,并初始化对象。但是 var n =new { Name = " s "}; 是编译不通过的。因为,编译器不知道匿名类中的property的名字。例如 string c = “d”; var d = new {c}; 则是可以通过编译的。编译器会创建一个叫做匿名类带有叫 c 的property。
例如上面例2:new { c.ContactName, c.Phone}; ContactName 和 Phone 都是在映射文件中定义与表中字段相对应的property。 编译器读取数据并创建对象时,会创建一个匿名类,这个类有两个属性:ContactName和Phone,然后根据数据初始化对象。另外,编译器还可以重命名property的名字。
3、该语句描述:使用select和匿名类型返回仅含雇员姓名和电话号码的序列,并将FirstName和LastName字段合并为一个字段“Name”,此外在所得的序列中将HomePhone字段重命名为Phone。
var n =
from e in db.Employees
select new
{ Name = e.FirstName + " " + e.LastName,
Phone = e.HomePhone
};
4、使用select和匿名类型返回所有产品id以及HalfPrice(设置为产品单价除以2所得的值)的序列。
var q =
from p in db.Products
select new
{
p.ProductID,
HalfPrice = p.UnitPrice / 2
};
三、条件形式
5、生成SQL语句为:case when condition then else.
var q =
from p in db.Products
select new
{
p.ProductName,
Availability = p.UnitsInStock - p.UnitsOnOrder < 0 ? "Put Of Stock" : "In Stock"
};
四、指定类型形式
6、使用select和已知类型返回雇员姓名的序列,即:返回自定义类型的对象集。
var q =
from e in db.Employees
select new Name
{
FirstName = e.FirstName,
LastName = e.LastName
};
五、筛选形式
7、结合where使用,起到过滤作用。使用select和where返回仅含中国客户联系人姓名的序列。
var q =
from c in db.Customers
where c.City == " China"
select c.ContactName;
六、shaped形式(整形类型)
8、使用select和匿名类型,返回有关客户的数据的整形子集。查询顾客的id和公司信息(名称、城市、国家)以及联系信息(联系人和职位)。
var q =
from p in db.Customers
select new
{
c.CustomerID,
CompanyInfo = new {c.CompanyName,c.City,c.Country},
ContactInfo = new {c.ContactName,c.ContactTitle}
};
说明:其select操作使用了匿名对象,而这个匿名对象中,其属性也是个匿名对象。
七、嵌套类型形式
9、使用嵌套查询但会所有订单及其OrderID的序列、打折订单中项目的子序列以及免送货所省下的金额。
var q =
from o in db.Orders
select new
{
o.OrderID,
DiscountedProducts =
from od in o.OrderDetails
where od.Discount > 0.0
select od,
FreeShippingDiscount = o.Freight
};
说明:返回的对象集中的每个对象DiscountedProducts属性中,又包含一个集合。也就是每个对象也是一个集合类。
八、本地方法调用形式(LocalMethodCall)
10、在查询中调用本地方法PhoneNumberConverter将电话号码转换为国际格式。
var q = from c in db.Customers
where c.Country == "UK" || c.Country == "USA"
select new
{
c.CustomerID,
c.CompanyName,
Phone = c.Phone,
InternationalPhone =
PhoneNumberConverter(c.Country, c.Phone)
};
PhoneNumberConverter方法如下:
public string PhoneNumberConverter(string Country, string Phone)
{
Phone = Phone.Replace(" ", "").Replace(")", ")-");
switch (Country)
{
case "USA":
return "1-" + Phone;
case "UK":
return "44-" + Phone;
default:
return Phone;
}
}
下面也是使用了这个方法将电话号码转换为国际格式并创建 XDocument
XDocument doc = new XDocument(
new XElement("Customers", from c in db.Customers
where c.Country == "UK" || c.Country == "USA"
select (new XElement("Customer",
new XAttribute("CustomerID", c.CustomerID),
new XAttribute("CompanyName", c.CompanyName),
new XAttribute("InterationalPhone",
PhoneNumberConverter(c.Country, c.Phone))
))));
九、Distinct形式
11、查询顾客覆盖的国家。
var q = (
from c in db.Customers
select c.City ).Distinct();
说明:筛选字段中不相同的值。用户查询不重复的结果集。生成SQL语句为:SELECT DISTINCT {CITY} FROM {Customers}
上一篇: LINQ简单使用与XML的转换
下一篇: Linq中的Join使用笔记
推荐阅读
-
SQL Select语句完整的执行顺序
-
Linq to SQL 插入数据时的一个问题
-
Sql Server函数的操作实例(执行多条语句,返回Select查询后的临时表)
-
LINQ to SQL:处理char(1)字段的方式会引起全表扫描问题
-
SQL、LINQ、Lambda 三种用法(转)
-
Mybaits 源码解析 (六)----- 全网最详细:Select 语句的执行过程分析(上篇)(Mapper方法是如何调用到XML中的SQL的?)
-
sql 语句插入结果为select和值混合示例
-
为什么说LINQ要胜过SQL
-
SQL数据库Select语句的基本语法、条件查询
-
Linq to SQL Delete时遇到问题的解决方法