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类型的话,也会出现上面所说的错误,如下图。

Categories:

Updated: