Linq to Entity怎么用?讲解下 100
1个回答
展开全部
LINQ to Entities 是 LINQ 中最吸引人的部分。它让你可以使用标准的 C# 对象与数据库的结构和数据打交道。使用 LINQ to Entities 时,LINQ 查询在后台转换为 SQL 查询并在需要数据的时候执行,即开始枚举结果的时候执行。LINQ to Entities 还为你获取的所有数据提供变化追踪,也就是说,可以修改查询获得的对象,然后整批同时把更新提交到数据库。
LINQ to Entities 是 Entity Framework 的一部分并且取代 LINQ to SQL 作为在数据库上使用 LINQ 的标准机制。Entity Framework 是行业领先的对象-关系映射(ORM)系统。可以和多种数据库一起使用,并支持各种灵活、复杂的数据模型。
注:
微软把开发的重点从 LINQ to SQL 转移到了 LINQ to Entities,并且宣布 LINQ to SQL 不再提供更新,LINQ to SQL 现在仍被支持单不推荐。
LINQ to Entities 是一项令人印象深刻的技术,但对大多数开发人员而言只是一个小的进步。和 DataSet 一样,ASP.NET 开发人员使用 LINQ 的查询特新远多于它的批量更新特性。这是因为通常 Web 应用程序的更新是单次的而不是批量的。他们更愿意在页面回发时立刻执行更新,同时可以获得原始值和新(更新)值,这使得通过 ADO.NET 命令提交更新更加方便。
简而言之,LINQ to Entities 没有提供任何不能用 ADO.NET代码、自定义对象、LINQ to Objects 实现的特性,但是有时出于某些原因而需要考虑使用 LINQ to Entities:
更少的代码。不必编写查询数据库的 ADO.NET 代码,可以通过一个工具生成需要的数据类。
灵活的查询能力。不必拼凑 SQL 语句,而是使用 LINQ 查询模型。一致的查询模型可访问众多不同的数据源(从数据库到 XML)。
变更追踪以及批量更新。可以对查询的数据进行多项修改并提交批量更新,这不需要编写任何 ADO.NET 代码。
生成数据模型
Entity Framework 依赖于一个数据模型来使用 LINQ to Entities 进行查询。表中的行被转换为 C# 对象的实例,表的列是这些对象的属性。数据库架构和数据模型对象的映射是 Entity Framework 的核心.
为了生成模型,右击 App_Code 目录,单击“添加新项”,“ADO.NET 实体数据模型”,设置创建的文件名称后(这里是 NorthwindModel.edmx),单击“确定”。
从一个已经存在的数据库生成模型,即微软的 Northwind 示例数据库。配置数据库连接,并可以选择表、视图、和存储过程。还可以选择使用复数还是单数形式的对象名(例如,Products 表的行被命名为 Product )、是否包含外键关系等。这里选择全部表并选中“所生成对象的单复数形式”。
Visual Studio 会为你选择的数据库元素创建模型图,它显示了已经创建的映射对象、对象拥有的字段以及对象之间的关系。
项目中新增了下面这两个文件:
NorthwindModel.edmx:这个XML文件定义数据库模型的架构。
NorthwindModel.Designer.cs:这个C#代码文件包含数据模型的映射对象。
数据模型类
我们将把大部分时间花在 NorthwindModel.Designer.cs这个文件上。因为它包含了我们要用于 LINQ to Entities 查询的数据类型。(这个文件会被数据模型重新生成,因此不应该也不必要手工去修改这个文件,你的修改会丢失。)
打开该文件,可以看到有两段代码区域:Contexts 和 Entities 。
1. 派生的对象上下文
NorthwindModel.Designer.cs文件中定义的第一个类从 ObjectContext 派生,其名称是 NorthwindEntities 。这个类的构造函数连接到所生成模型的数据库,或者你也可以指定连接字符串连接到其他数据库(必须具有相同的架构,否则模型无法工作)。
下面是一个简单的示例:
protectedvoidPage_Load(objectsender, EventArgs e)
{
NorthwindEntities db = newNorthwindEntities();
GridView1.DataSource = db.Products
LINQ to Entities 是 Entity Framework 的一部分并且取代 LINQ to SQL 作为在数据库上使用 LINQ 的标准机制。Entity Framework 是行业领先的对象-关系映射(ORM)系统。可以和多种数据库一起使用,并支持各种灵活、复杂的数据模型。
注:
微软把开发的重点从 LINQ to SQL 转移到了 LINQ to Entities,并且宣布 LINQ to SQL 不再提供更新,LINQ to SQL 现在仍被支持单不推荐。
LINQ to Entities 是一项令人印象深刻的技术,但对大多数开发人员而言只是一个小的进步。和 DataSet 一样,ASP.NET 开发人员使用 LINQ 的查询特新远多于它的批量更新特性。这是因为通常 Web 应用程序的更新是单次的而不是批量的。他们更愿意在页面回发时立刻执行更新,同时可以获得原始值和新(更新)值,这使得通过 ADO.NET 命令提交更新更加方便。
简而言之,LINQ to Entities 没有提供任何不能用 ADO.NET代码、自定义对象、LINQ to Objects 实现的特性,但是有时出于某些原因而需要考虑使用 LINQ to Entities:
更少的代码。不必编写查询数据库的 ADO.NET 代码,可以通过一个工具生成需要的数据类。
灵活的查询能力。不必拼凑 SQL 语句,而是使用 LINQ 查询模型。一致的查询模型可访问众多不同的数据源(从数据库到 XML)。
变更追踪以及批量更新。可以对查询的数据进行多项修改并提交批量更新,这不需要编写任何 ADO.NET 代码。
生成数据模型
Entity Framework 依赖于一个数据模型来使用 LINQ to Entities 进行查询。表中的行被转换为 C# 对象的实例,表的列是这些对象的属性。数据库架构和数据模型对象的映射是 Entity Framework 的核心.
为了生成模型,右击 App_Code 目录,单击“添加新项”,“ADO.NET 实体数据模型”,设置创建的文件名称后(这里是 NorthwindModel.edmx),单击“确定”。
从一个已经存在的数据库生成模型,即微软的 Northwind 示例数据库。配置数据库连接,并可以选择表、视图、和存储过程。还可以选择使用复数还是单数形式的对象名(例如,Products 表的行被命名为 Product )、是否包含外键关系等。这里选择全部表并选中“所生成对象的单复数形式”。
Visual Studio 会为你选择的数据库元素创建模型图,它显示了已经创建的映射对象、对象拥有的字段以及对象之间的关系。
项目中新增了下面这两个文件:
NorthwindModel.edmx:这个XML文件定义数据库模型的架构。
NorthwindModel.Designer.cs:这个C#代码文件包含数据模型的映射对象。
数据模型类
我们将把大部分时间花在 NorthwindModel.Designer.cs这个文件上。因为它包含了我们要用于 LINQ to Entities 查询的数据类型。(这个文件会被数据模型重新生成,因此不应该也不必要手工去修改这个文件,你的修改会丢失。)
打开该文件,可以看到有两段代码区域:Contexts 和 Entities 。
1. 派生的对象上下文
NorthwindModel.Designer.cs文件中定义的第一个类从 ObjectContext 派生,其名称是 NorthwindEntities 。这个类的构造函数连接到所生成模型的数据库,或者你也可以指定连接字符串连接到其他数据库(必须具有相同的架构,否则模型无法工作)。
下面是一个简单的示例:
protectedvoidPage_Load(objectsender, EventArgs e)
{
NorthwindEntities db = newNorthwindEntities();
GridView1.DataSource = db.Products
追答
protectedvoidPage_Load(objectsender, EventArgs e)
{
NorthwindEntities db = newNorthwindEntities();
GridView1.DataSource = db.Products;
GridView1.DataBind();
}
2. 实体类
实体类用于把数据库表的记录映射到C#对象。如果选中了“确定所生成对象的单复数形式”选项,那么像 Products 这样的表创建的实体对象名称是 Product。
每个实体对象包含如下的内容:
工厂方法:可以通过默认的构造函数或工厂方法创建实体对象新实例。工厂方法的参数是需要的字段,它是试图保存数据元素时防止架构错误的好办法。
字段属性:实体对象为它们派生的数据库表的每个列包含一个字段属性。
导航属性:如果数据模型中包含了外键关系,实体对象就会包含帮助访问关联数据的导航属性。
提示:
实体类被声明为分部类,因此可以创建扩展功能,在重新生成数据模型时它不会被覆盖。
示例:
protectedvoidPage_Load(objectsender, EventArgs e)
{
NorthwindEntities db = newNorthwindEntities();
var result = from p indb.Products
wherep.Discontinued == false
select new
{
ID = p.ProductID,
Name = p.ProductName
};
GridView1.DataSource = result;
GridView1.DataBind();
}
ID=5 的产品不符合条件被过滤掉了
实体关系
实体类包含导航属性。通过导航属性可以在数据模型间移动而不需要考虑外键关系。看下面的示例:
protectedvoidPage_Load(objectsender, EventArgs e)
{
NorthwindEntities db = newNorthwindEntities();
var result = fromc indb.Customers
leto = fromq inc.Orders
whereq.Employee.LastName != "King"
selectq
wherec.City == "London"&& o.Count() > 5
selectnew
{
Name = c.CompanyName,
Contact = c.ContactName,
OrderCount = o.Count()
};
GridView1.DataSource = result;
GridView1.DataBind();
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询