`

Entity Framework 学习总结之九:LinqToEntities

 
阅读更多

介绍

LINQ to Entities 使开发人员能够通过使用 LINQ 表达式和 LINQ 标准查询运算符,直接从开发环境中针对实体框架对象上下文创建灵活的强类型查询。 LINQ to Entities 查询使用对象服务基础结构。 ObjectContext 类是作为 CLR 对象与 实体数据模型 进行交互的主要类。开发人员通过 ObjectContext 构造泛型 ObjectQuery 实例。 ObjectQuery 泛型类表示一个查询,此查询返回一个由类型化实体组成的实例或集合。返回的实体对象可供更新并位于对象上下文中。以下是创建和执行 LINQ to Entities 查询的过程:

1) ObjectContext 构造 ObjectQuery 实例。

2) 通过使用 ObjectQuery 实例在 C# Visual Basic 中编写 LINQ to Entities 查询。

3) LINQ 标准查询运算符和表达式将转换为命令目录树。

4) 对数据源执行命令目录树表示形式的查询。执行过程中在数据源上引发的任何异常都将直接向上传递到客户端。

5) 将查询结果返回到客户端。

 

查询使用

相关的查询语法可以使用基于表达式或基于方法的语法。

 

1 、投影

代码片断:

using (var edm = new NorthwindEntities ())

{

    ObjectQuery <Orders > orders = edm.Orders;

    IQueryable <Orders > result = from order in orders

                                select order;

 

    foreach (Orders o in result)

    {

        Console .WriteLine("{0},{1}" , o.OrderID, o.OrderDate);

    }

 

    Console .WriteLine(orders.ToTraceString());

}

 

2 、条件限制

代码片断:

DateTime orderDate =new DateTime (1996,7,9);

 

// 第一种方法在表达式中进行Where

//ObjectQuery<Orders> orders = edm.Orders;

//IQueryable<Orders> result = from order in orders

                            //where order.OrderDate <= orderDate

                            //select order ;

 

// 可以直接在edm.Orders对象上使用Where扩展方法

var orders = edm.Orders.Where(order => order.OrderDate <= orderDate);

IQueryable <Orders > result = from order in orders

                            select order;

 

 

foreach (Orders o in result)

{

    Console .WriteLine("{0},{1}" , o.OrderID, o.OrderDate);

}

 

//Console.WriteLine(orders.ToTraceString());

 

// 对比生成的SQL语句,此种在本质上筛选,而前种方法是在内存中筛选。

Console .WriteLine(((ObjectQuery )orders).ToTraceString());

 

结果:

 

3 、排序和分页

在使用 Skip Take 方法实现分页时,必须先对数据进行排序,否则将会抛异常。

代码片断:

DateTime orderDate = new DateTime (1996, 7, 9);

 

// 第一种方法在表达式中进行分页

ObjectQuery <Orders > orders = edm.Orders;

IQueryable <Orders > result = (from order in orders

                             where order.OrderDate > orderDate

                             orderby order.OrderID

                             select order).Skip(0).Take(2);

 

// 可以直接在edm.Orders对象上使用Where、OrderBy、Skip、Take扩展方法。

//var orders = edm.Orders.Where(order => order.OrderDate <= orderDate).OrderBy(order => order.OrderID).Skip(0).Take(2);

// 可以直接foreach (Orders o in orders)

foreach (Orders o in result)

{

    Console .WriteLine("{0},{1}" , o.OrderID, o.OrderDate);

}

 

Console .WriteLine(orders.ToTraceString());

 

// 对比生成的SQL语句,此种在本质上筛选,而前种方法是在内存中筛选。

//Console.WriteLine(((ObjectQuery)orders).ToTraceString());

 

第一种方法输出结果:

10253,1996/7/10 0:00:00

10254,1996/7/11 0:00:00

SELECT

[Extent1].[OrderID] AS [OrderID],

[Extent1].[CustomerID] AS [CustomerID],

[Extent1].[EmployeeID] AS [EmployeeID],

[Extent1].[OrderDate] AS [OrderDate],

[Extent1].[RequiredDate] AS [RequiredDate],

[Extent1].[ShippedDate] AS [ShippedDate],

[Extent1].[ShipVia] AS [ShipVia],

[Extent1].[Freight] AS [Freight],

[Extent1].[ShipName] AS [ShipName],

[Extent1].[ShipAddress] AS [ShipAddress],

[Extent1].[ShipCity] AS [ShipCity],

[Extent1].[ShipRegion] AS [ShipRegion],

[Extent1].[ShipPostalCode] AS [ShipPostalCode],

[Extent1].[ShipCountry] AS [ShipCountry]

FROM [dbo].[Orders] AS [Extent1]

 

第二种方法输出结果:

10248,1996/7/4 0:00:00

10249,1996/7/5 0:00:00

SELECT TOP (2)

[Project1].[OrderID] AS [OrderID],

[Project1].[CustomerID] AS [CustomerID],

[Project1].[EmployeeID] AS [EmployeeID],

[Project1].[OrderDate] AS [OrderDate],

[Project1].[RequiredDate] AS [RequiredDate],

[Project1].[ShippedDate] AS [ShippedDate],

[Project1].[ShipVia] AS [ShipVia],

[Project1].[Freight] AS [Freight],

[Project1].[ShipName] AS [ShipName],

[Project1].[ShipAddress] AS [ShipAddress],

[Project1].[ShipCity] AS [ShipCity],

[Project1].[ShipRegion] AS [ShipRegion],

[Project1].[ShipPostalCode] AS [ShipPostalCode],

[Project1].[ShipCountry] AS [ShipCountry]

FROM ( SELECT [Project1].[OrderID] AS [OrderID], [Project1].[CustomerID] AS [Cus

tomerID], [Project1].[EmployeeID] AS [EmployeeID], [Project1].[OrderDate] AS [Or

derDate], [Project1].[RequiredDate] AS [RequiredDate], [Project1].[ShippedDate]

AS [ShippedDate], [Project1].[ShipVia] AS [ShipVia], [Project1].[Freight] AS [Fr

eight], [Project1].[ShipName] AS [ShipName], [Project1].[ShipAddress] AS [ShipAd

dress], [Project1].[ShipCity] AS [ShipCity], [Project1].[ShipRegion] AS [ShipReg

ion], [Project1].[ShipPostalCode] AS [ShipPostalCode], [Project1].[ShipCountry]

AS [ShipCountry], row_number() OVER (ORDER BY [Project1].[OrderID] ASC) AS [row_

number]

        FROM ( SELECT

                [Extent1].[OrderID] AS [OrderID],

                [Extent1].[CustomerID] AS [CustomerID],

                [Extent1].[EmployeeID] AS [EmployeeID],

                [Extent1].[OrderDate] AS [OrderDate],

                [Extent1].[RequiredDate] AS [RequiredDate],

                [Extent1].[ShippedDate] AS [ShippedDate],

                [Extent1].[ShipVia] AS [ShipVia],

                [Extent1].[Freight] AS [Freight],

                [Extent1].[ShipName] AS [ShipName],

                [Extent1].[ShipAddress] AS [ShipAddress],

                [Extent1].[ShipCity] AS [ShipCity],

                [Extent1].[ShipRegion] AS [ShipRegion],

                [Extent1].[ShipPostalCode] AS [ShipPostalCode],

                [Extent1].[ShipCountry] AS [ShipCountry]

                FROM [dbo].[Orders] AS [Extent1]

                WHERE [Extent1].[OrderDate] <= @p__linq__0

        ) AS [Project1]

)  AS [Project1]

WHERE [Project1].[row_number] > 0

ORDER BY [Project1].[OrderID] ASC

 

4 、聚合

可使用的聚合运算符有 Average Count Max Min Sum

代码片断:

var maxuprice = edm.Products.Max(p => p.UnitPrice);

Console .WriteLine(maxuprice.Value);

 

5 、连接

可以的连接有 Join GroupJoin 方法。 GroupJoin 组联接等效于左外部联接,它返回第一个(左侧)数据源的每个元素(即使其他数据源中没有关联元素)。

代码片断:

var query = from d in edm.Order_Details

            join order in edm.Orders

            on d.OrderID equals order.OrderID

            select new

            {

                OrderId = order.OrderID,

                ProductId = d.ProductID,

                UnitPrice = d.UnitPrice

            };

 

foreach (var q in query)

{

    Console .WriteLine("{0},{1},{2}" , q.OrderId, q.ProductId, q.UnitPrice);

}

详细的使用方法可以参考 Linq to SQL

有关 LINQ 可以了解: http://msdn.microsoft.com/zh-cn/magazine/cc337893.aspx

本文严重参考: http://www.cnblogs.com/xray2005/archive/2009/05/09/1453036.html

分享到:
评论

相关推荐

    Entity Framework技术系列之7:LINQ to Entities.pdf

    LINQ to Entities是LINQ技术在Entity Framework中的具体实现,它提供了一种使用LINQ查询Entity Framework实体数据模型的方法。LINQ to Entities可以生成eSQL(Entity SQL),并支持使用LINQ语法对实体框架服务层进行...

    Entity Framework技术系列之1:数据访问技术概述

    随着.NET Framework的发展,数据访问技术也随之进化。从最初的ADO.NET,到后来出现的各种简化封装和技术革新,如SqlHelper、DAAB(Data Access Application Block)、LINQ,直至现在广泛推荐使用的Entity Framework...

    Programming Entity Framework DbContext

    在本篇详细知识点讲解中,将基于给定文件信息,深入探讨Entity Framework(实体框架)中Code First方法的相关知识点。根据文件标题《Programming Entity Framework DbContext》和描述,该文件应该是关于Entity ...

    EntityFramework.zip

    总结来说,"EntityFramework.zip"中的资源很可能是关于如何在.NET环境中使用Entity Framework进行数据库操作和实体与DTO之间映射的实例和指南。对于.NET开发者来说,理解并掌握这些概念和技术对于提升开发效率和代码...

    entityFramework源代码

    深入学习Entity Framework 6的源代码,你可以了解以下内容: - 如何实现ORM框架的基本架构。 - EF如何将对象模型映射到数据库表。 - 查询翻译的过程,包括从LINQ表达式到SQL语句的转换。 - 数据库操作的事务管理和...

    EntityFramework.SqlServer_EntityFramework_

    Entity Framework (EF) 是微软提供的一款强大的对象关系映射(ORM)框架,它允许开发者使用.NET语言(如C#或VB.NET)来操作数据库,而无需编写大量的SQL语句。在.NET开发中,EF极大地提高了开发效率,因为它将数据...

    Entity_Framework_学习.pdf

    在学习和使用Entity Framework时,可以通过创建一个解决方案并添加类库项目来开始。例如,创建一个名为“EFProject”的解决方案,并添加名为“EFModel”的类库项目。随后,可以添加一个“***EntityDataModel”项目,...

    Entity Framework 学习资料

    Entity Framework (EF) 是微软提供的一种对象关系映射(ORM)框架,用于.NET应用程序中处理数据库交互。它允许开发者使用面向对象的编程语言(如C#或VB.NET)来操作数据库,而无需直接编写SQL语句,从而简化了数据...

    Entity Framework 4 In Action

    ### Entity Framework 4 In Action:全面解析与应用实践 #### 一、书籍概述与背景介绍 《Entity Framework 4 In Action》是一本深入探讨Entity Framework 4(简称EF4)的权威指南,由Stefano Mostarda、Marco De ...

    Entity Framework 4.0 and Web Forms

    Entity Framework 4.0和*** Web Forms是微软公司推出的用于构建Web应用程序的技术,这本书主要讲述了如何使用Entity Framework 4.0在*** Web Forms应用程序中实现数据的显示和编辑。 Entity Framework是微软的.NET...

    Entity Framework官方中文教程

    Entity Framework(EF)是微软提供的一个对象关系映射(O/RM)框架,它简化了.NET开发人员访问数据库的代码编写,无需手动编写大量数据访问代码。EF允许开发者通过.NET对象模型来操作数据库。Entity Framework Core...

    Entity Framework 学习教程

    Entity Framework 学习教程,chm格式,方便离线阅读,需要学习实体框架技术的同仁,可以下载来学习啦

    EntityFramework.dll

    随着后续版本的不断迭代,Entity Framework的功能越来越完善,逐渐成为.NET平台上ORM工具的首选之一。在使用EntityFramework.dll时,开发者应了解其工作原理和最佳实践,以便更好地利用其功能并避免潜在的问题。

    Entity Framework学习笔记

    Entity Framework(简称EF)是微软提供的一款对象关系映射(ORM)框架,它允许开发者使用.NET语言(如C#或VB.NET)来操作数据库,而无需编写大量的SQL语句。在EF中,实体数据模型(Entity Data Model)是核心概念,...

    Entity Framework 学习.rar

    通过深入学习和实践Entity Framework,开发者可以更加高效地进行数据操作,减少与数据库的直接交互,提高代码的可维护性和可读性。同时,由于ORM框架的存在,开发者可以更加专注于业务逻辑,而不是数据库的细节。...

    Entity Framework 6 Recipes

    Entity Framework 6 Recipes Entity Framework 6 Recipes

    Entity Framework Core Cookbook - Second Edition 2016

    Entity Framework Core Cookbook - Second Edition by Ricardo Peres English | 9 Nov. 2016 | ISBN: 1785883305 | 340 Pages | MOBI/EPUB/PDF+Code Files | 6.2 MB Entity Framework is a highly recommended ...

    EntityFrameworkCore.zip

    EntityFrameworkCore是一个强大的ORM(对象关系映射)框架,专为.NET Core和.NET Framework设计,由微软维护。它使得.NET开发者无需直接操作SQL语句,就能通过C#代码与数据库进行交互,极大地提高了开发效率。Entity...

    Entity Framework orm教程

    标题:“Entity Framework orm教程”中所涵盖的知识点 Entity Framework(简称EF)是微软推出的一个对象关系映射框架(ORM),它允许.NET开发人员以面向对象的方式操作数据库中的数据,而不需要编写大量的SQL代码。...

    ADO.NET EntityFramework 完整版教程(从初级到高级)

    ### ADO.NET Entity Framework 教程知识点概览 #### 一、Entity Framework 概述 - **背景**:Entity Framework (EF) 是 Microsoft 推出的一款 ORM (Object Relational Mapping) 工具,旨在简化数据访问层的开发,...

Global site tag (gtag.js) - Google Analytics