LINQ TO SQL中的查询
LINQ中select查询分为两种方式,一种是普通方式,另外一种是匿名查询方式。我们用微软的表顺实例库Northwind。
//一般查询
var q1 = from p in context.Products
where p.UnitPrice > 20m
select p;
//匿名类型
var q2 = from p in context.Products
where p.UnitPrice > 20m
select new { p.ProductName, p.UnitPrice };
上述两个LINQ语句都是查询UnitPrice>20的产品。不同的是,下面的语句中采用的是匿名查询方式。既查询结果是匿名类型的。
匿名类型是.NET在内存当中开辟出一块临时的内存空间,存贮匿名类型的实例。匿名类型必须有属性,而上述第二个LINQ语句中默认将ProductName和UnitPrice当做的q2查询结果的属性,而他们的值来自于表Products且符合where查询条件的数据。
再稍微加点料。
在LINQ TO SQL中的连接类型。
多表连接:
一对多
在一对多(SelectMany)查询中,查询语句需包含Set集合,类似如下代码
var q1 = from c in context.Categories
from p in c.Products
where c.CategoryName == ""
select new { c.CategoryID, p.ProductName };
查询实体顺序,从父到子,若是从子到父会出现如下错误
在源类型为“System.Data.Linq.Table<MySolution.Model.Products>”的查询表达式中,不允许在后面的 From 子句中使用类型为“MySolution.Model.Categories”的表达式。对“SelectMany”的调用中的类型推理失败。
多对多
多对多涉及三张表,但查询方式和一对多差不多,生成的sql语句略有不同。简要的概括下多对多的思路就是,在LINQ多对多查询中,首先确定的是一对多的关系,查询结果涉及第三张表。
var q1 = from t in context.Territories
from et in t.EmployeeTerritories
where t.TerritoryID == "01581"
select new {t.TerritoryID,et.Employees.FirstName };
上述代码中,多对多的关系体现在Territories以及Employees之间,关系表为EmployeeTerritories,而我们可以认为,Territories和Employees分别与EmployeeTerritories是一对多的关系。从而顺由Territories到EmployeeTerritories,查询结果当中涉及Employees这张表。
自连接
顾名思义,自连接既自己连接自己,以自己的某些字段作为条件筛选出符合条件记录。
var q1 = from e1 in context.Employees
from e2 in e1.Employees2
where e1.Country == e2.Country
select new
{
FirstName1 = e1.FirstName,
LastName1 = e1.LastName,
FirstName2 = e2.FirstName,
LastName2 = e2.LastName,
e1.City
};
上述代码中查询的是具有相同城市名称的雇员。在et1中会产生两个名称为Employees1和Employees2的可访问变量,这时需要选择其中EntitySet类型的。若采用Employees类型的话,也会出现上面所说的错误,如下图。