猿教程 Logo

Linq to Entities 映射查询

在这里,您将学习如何编写LINQ-to-Entities查询并获取实体结果。

现在,我们将看到一些投影样式:



First/FirstOrDefault:

如果你想获得一个Student对象,当有很多学生,他的名字在数据库是“Student1”,可以使用First或FirstOrDefault,如下所示:

using (var ctx = new SchoolDBEntities())
{    
    var student = (from s in ctx.Students
                where s.StudentName == "Student1"
                select s).FirstOrDefault<Student>();
}

上面的查询将执行以下数据库查询:

SELECT TOP (1)
[Extent1].[StudentID] AS [StudentID],
[Extent1].[StudentName] AS [StudentName],
[Extent1].[StandardId] AS [StandardId]
FROM [dbo].[Student] AS [Extent1]
WHERE 'Student1' = [Extent1].[StudentName]

First()与FirstOrDefault()的区别是:如果结果数据没有值时,First()将抛出异常,而FirstOrDefault()将返回默认值为空的结果。


Single/SingleOrDefault:

您还可以使用Single 或SingleOrDefault查询单个学生对象,如下所示:

using (var ctx = new SchoolDBEntities())
{    
    var student = (from s in context.Students
                    where s.StudentID == 1
                    select s).SingleOrDefault<Student>();
}

上面的查询将执行以下数据库查询:

SELECT TOP (2)
[Extent1].[StudentID] AS [StudentID],
[Extent1].[StudentName] AS [StudentName],
[Extent1].[StandardId] AS [StandardId]
FROM [dbo].[Student] AS [Extent1]
WHERE 1 = [Extent1].[StudentID]
go

如果结果包含不止一个元素,Single或SingleOrDefault将抛出异常。如果你确定结果只包含一个元素,可以使用Single或SingleOrDefault。如果结果有多个元素,那么一定会抛出异常。



ToList:

如果你想要列出所有名称叫“Student1”的学生(只要有许多学生有相同的名称),可以使用ToList():

using (var ctx = new SchoolDBEntities())
{    
    var studentList = (from s in ctx.Students
    where s.StudentName == "Student1"
    select s).ToList<Student>();
}

上面的查询将执行以下数据库查询:

SELECT
[Extent1].[StudentID] AS [StudentID],
[Extent1].[StudentName] AS [StudentName],
[Extent1].[StandardId] AS [StandardId]
FROM [dbo].[Student] AS [Extent1]
WHERE 'Student1' = [Extent1].[StudentName]
go

GroupBy:

如果你想以standardId为组来查询学生列表,可以使用groupby:

using (var ctx = new SchoolDBEntities())
{    
    var students = from s in ctx.Students 
                   group s by  s.StandardId into studentsByStandard
                   select studentsByStandard;
}

上面的查询将执行以下数据库查询:


SELECT
[Project2].[C1] AS [C1],
[Project2].[StandardId] AS [StandardId],
[Project2].[C2] AS [C2],
[Project2].[StudentID] AS [StudentID],
[Project2].[StudentName] AS [StudentName],
[Project2].[StandardId1] AS [StandardId1]
FROM ( SELECT
[Distinct1].[StandardId] AS [StandardId],
1 AS [C1],
[Extent2].[StudentID] AS [StudentID],
[Extent2].[StudentName] AS [StudentName],
[Extent2].[StandardId] AS [StandardId1],
CASE WHEN ([Extent2].[StudentID] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C2]
FROM   (SELECT DISTINCT
[Extent1].[StandardId] AS [StandardId]
FROM [dbo].[Student] AS [Extent1] ) AS [Distinct1]
LEFT OUTER JOIN [dbo].[Student] AS [Extent2] ON ([Distinct1].[StandardId] = [Extent2].[StandardId]) OR (([Distinct1].[StandardId] IS NULL) AND ([Extent2].[StandardId] IS NULL))
)  AS [Project2]
ORDER BY [Project2].[StandardId] ASC, [Project2].[C2] ASC
go



OrderBy:

如果你想查询按StudentName排序的学生列表,可以使用OrderBy:

using (var ctx = new SchoolDBEntities())
{    
        var student1 = from s in ctx.Students
                    orderby s.StudentName ascending
                    select s;
}

上面的查询将执行以下数据库查询:

SELECT
[Extent1].[StudentID] AS [StudentID],
[Extent1].[StudentName] AS [StudentName],
[Extent1].[StandardId] AS [StandardId]
FROM [dbo].[Student] AS [Extent1]
ORDER BY [Extent1].[StudentName] ASC
go



匿名类查询结果

如果你想得到只有StudentName、StandardName、Courses的列表,可以按编写如下:

using (var ctx = new SchoolDBEntities())
{    
    var projectionResult = from s in ctx.Students
                        where s.StudentName == "Student1"
                        select new { 
                        s.StudentName, s.Standard.StandardName, s.Courses 
                        };
}

上面的查询将执行以下数据库查询:

SELECT
[Extent1].[StudentID] AS [StudentID],
[Extent1].[StudentName] AS [StudentName],
[Extent2].[City] AS [City]
FROM  [dbo].[Student] AS [Extent1]
LEFT OUTER JOIN [dbo].[StudentAddress] AS [Extent2] ON [Extent1].[StudentID] = [Extent2].[StudentID]
WHERE 1 = [Extent1].[StandardId]
go

使用这种方式,编译器会将返回实体集中的类型标为匿名类,因为没有对应的实体类。



嵌套查询

您还可以执行嵌套LINQ实体查询,如下所示:


上面所示的嵌套查询将返回一个匿名类结果集(StudentName和课程对象列表)。

SELECT
[Extent1].[StudentID] AS [StudentID],
[Extent1].[StudentName] AS [StudentName],
[Join1].[CourseId1] AS [CourseId],
[Join1].[CourseName] AS [CourseName],
[Join1].[Location] AS [Location],
[Join1].[TeacherId] AS [TeacherId]
FROM  [dbo].[Student] AS [Extent1]
INNER JOIN  (SELECT [Extent2].[StudentId] AS [StudentId], [Extent3].[CourseId] AS [CourseId1], [Extent3].[CourseName] AS [CourseName], 
[Extent3].[Location] AS [Location], [Extent3].[TeacherId] AS [TeacherId]
FROM  [dbo].[StudentCourse] AS [Extent2]
INNER JOIN [dbo].[Course] AS [Extent3] ON [Extent3].[CourseId] = [Extent2].[CourseId] ) AS [Join1] ON [Extent1].[StudentID] = [Join1].[StudentId]
WHERE 1 = [Extent1].[StandardId]
go

通过这种方式,您可以做一个投影的结果来获取你想要查询的数据。



版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/entity/linq-to-entities-projection.html