Linq To Entities 及其相关
说到Linq,很多人都非常熟悉,我们可以很方便的用它来操纵对象的集合。今天要说的是Linq To Entities及其相关的操作。下面一步一步的来进行。这里我着重强调的是语法上面的一些注意点。所以怎么通过ObjectContext生成数据库代理类,我就不说了。下面的代码就是新建一个代理类,通过这个代理类,我们可以查看所有包含的表对象及其字段:
NorthWindEntities nWEntities = new NorthWindEntities();
查询
首先来说说查询操作:
//Select records.
IEnumerable<Product> productList = from p in nWEntities.Products
select p;
Console.WriteLine("Select Records scenario: There are {0} products",productList.Count());
Console.WriteLine("=============================================");
更新
然后来说说更新操作:
//Update records.
Product product = productList.ElementAtOrDefault(10);
if (product != null)
{
decimal newValue = (decimal)product.UnitPrice + 10;
Console.WriteLine("Update Records scenario: before update ,the unityPrice is {0}", product.UnitPrice);
product.UnitPrice = newValue;
nWEntities.SaveChanges();
Console.WriteLine("Update Records scenario: after update, the unityPrice is {0}",product.UnitPrice);
}
Console.WriteLine("=============================================");
注意这里我们利用的是SaveChanges方法进行提交。
插入
然后来说说插入操作:
//Insert records
Product newProduct = new Product() { ProductName = "This is new product" };
nWEntities.Products.AddObject(newProduct);
nWEntities.SaveChanges();
Product retriveNewProduct = nWEntities.Products.Where(p => p.ProductName == "This is new product").FirstOrDefault();
Console.WriteLine("Insert records scenario: after insert, the new product name is {0} ",retriveNewProduct.ProductName);
Console.WriteLine("=============================================");
删除
然后就是删除操作:
//Delete records
Product productForDelete = nWEntities.Products.Where(p => p.ProductName == "This is new product").FirstOrDefault();
nWEntities.Products.DeleteObject(productForDelete);
nWEntities.SaveChanges();
Console.WriteLine("Delete records scenario: the product with id {0} has been deleted.", productForDelete.ProductID);
Console.WriteLine("=============================================");
上面就是整个CRUD的代码,内容我就不多说了。由于Linq To Entities为我们生成了CRUD的方法,所以我们直接调用后,利用SaveChanges方法即可将结果保存到数据库。
接下来要说明的是延缓执行,早绑定,晚绑定以及表连接的内容。
延缓执行
对于延缓执行(Deferred Execution),其实就是指数据真正被需要的时候,才去数据库拿,而不是说Linq一准备好,就直接去数据库拿数据,这样对数据库造成的压力是不小的。
//Test Deferred Execution(延缓执行)
IQueryable<Product> productOnDeferredExecution = from p in nWEntities.Products
where p.Category.CategoryName == "This is new product"
orderby p.ProductName
select p;
//下面才真正被执行
Console.WriteLine("Deferred Execution scenario: Totally {0} products", productOnDeferredExecution.Count());
Console.WriteLine("============================================="); //Test Deferred Execution1(延缓执行1)
//下面这句就已经被真正执行
decimal? averagePrice = (from p in nWEntities.Products select p.UnitPrice).Average();
Console.WriteLine("Deferred Execute scenario for single object: The average price is {0}", averagePrice);
Console.WriteLine("============================================="); //Test Deferred Execution2(延缓执行,稍微复杂一点)
var cheapestProductsByCategory =
from p in nWEntities.Products
group p by p.CategoryID into g
select new
{
CategoryID = g.Key,
CheapestProduct =
from p2 in g
where p2.UnitPrice == g.Min(p3 => p3.UnitPrice)
select p2).FirstOrDefault()
};
Console.WriteLine("Deferred Execute scenario: Cheapest Products are:");
//遇到Foreach的时候,才被执行
foreach (var tP in cheapestProductsByCategory)
{
if (tP.CategoryID != null && tP.CheapestProduct != null)
Console.WriteLine("category:{0} | product name: {1} | price: {2}", tP.CategoryID, tP.CheapestProduct.ProductName, tP.CheapestProduct.UnitPrice);
}
Console.WriteLine("=============================================");
对于代码段1,只有当productOnDeferredExecution.Count()被调用的时候,程序才从数据库获取数据;
对于代码段2,由于获取出来的直接是decimal类型,所以当程序走到decimal? averagePrice = (from p …).Average(); 的时候,程序已经开始去数据库获取数据了。
对于代码段3,由于获取出来的cheapestProductsByCategory 是IQueryable类型,所以只有当代码执行到Foreach的时候,程序才开始从数据库中去取数据。
晚绑定
而说到晚绑定(Lazy loading),则是指我只有需要某个表中的数据的时候,才去数据库拿,而不是在先期直接把所有涉及到的表的数据都给拿出来:
//Lazy Loading(晚绑定)
var categories = from c in nWEntities.Categories select c;
//当循环执行的时候,每循环一次,EF就自动去数据库执行一次数据查询
foreach (var category in categories)
{
Console.WriteLine(" Lazy Loading scenario: There are {0} products in category {1}",category.Products.Count,category.CategoryName);
}
Console.WriteLine("=============================================");
在上面代码中,当遇到Foreach的时候,程序才开始去数据库中拿数据,并且在每次循环中,程序都会去数据拿一次数据。这个可以在Sql Profile中最追踪到。比如我当前有8个category,那么在8次循环中,程序将访问8次数据库,以便拿到合适的数据。
早绑定
说到早绑定(Eager loading),则与上面相反,他是指,把所有相关联的表的数据在先期都提取出来,省去了频繁往返数据库的麻烦。这里我们可以通过include关键字将涉及的表全部绑定起来:
//Eager Loading (早绑定)
//利用Include可以让查询把需要的表给提前包含进来。这样就不必每循环一次,就查询一次数据库
var categoriesOnEagerLoading = from c in nWEntities.Categories.Include("Products") select c;
foreach (var category in categoriesOnEagerLoading)
{
Console.WriteLine(" Eager Loading scenario: There are {0} products in category {1}", category.Products.Count, category.CategoryName);
}
Console.WriteLine("=============================================");
在上面代码中,我们利用Include("Products")语句将Products表中的数据也绑定进来,在下面Foreach的时候,程序就不用再循环返回数据库获取数据了。
我们可以同时通过Include("Products").Include("***")来加入多张需要提前绑定的表。
表连接
说到JoinTable,我们就不用多费口舌了,具体说来就是通过Join关键字来实现:
//Join Tables
var categoriesProducts = from c in nWEntities.Categories
join p in nWEntities.Products
on c.CategoryID equals p.CategoryID
into productsByCategoryID
select new
{
c.CategoryName,
productCount = productsByCategoryID.Count()
};
foreach (var p in categoriesProducts)
{
Console.WriteLine("Join tables scenario: There are {0} products in category {1}",p.productCount,p.CategoryName);
}
执行结果
最后来看下输出结果:

源码下载
Linq To Entities 及其相关的更多相关文章
- Linq To Entities 及其相关(进阶)
上篇我们讲解了Linq To Entities的一些基本操作,这篇我们主要是讲解一些比较高级的东西:存储过程查询,SQL语句查询以及表达式树. 存储过程 首先来讲解存储过程查询. //Query a ...
- LINQ to Entities 查询语法
转自: http://www.cnblogs.com/asingna/archive/2013/01/28/2879595.html 实体框架(Entity Framework )是 ADO.NET ...
- LINQ(LINQ to Entities)
LINQ to Entities 是 LINQ 中最吸引人的部分.它让你可以使用标准的 C# 对象与数据库的结构和数据打交道.使用 LINQ to Entities 时,LINQ 查询在后台转换为 S ...
- C#_LINQ(LINQ to Entities)
LINQ to Entities 是 LINQ 中最吸引人的部分.它让你可以使用标准的 C# 对象与数据库的结构和数据打交道.使用 LINQ to Entities 时,LINQ 查询在后台转换为 S ...
- LINQ to Entities 查询中的标准查询运算符
投影和筛选方法 投影指的是转换的结果集到所需的窗体中的元素. 例如,可以从结果集中的每个对象投影所需的属性子集,可以投影一个属性并对其执行数学计算,也可以从结果集投影整个对象. 投影方法有 Selec ...
- LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”
我就不屁话,能一张图就解决的就不说话了 2015-03-28 14:53:24,440 [10] ERROR log - System.NotSupportedException: LINQ to E ...
- 【转】Entity Framework技术系列之7:LINQ to Entities
前言 LINQ(Language Integrated Query,语言集成查询)是一组用于C#和VB.NET语言的扩展,它允许编写C#或者VB.NET代码,以与查询数据库相同的方式操作内存数据. L ...
- mvc ef LINQ to Entities 不识别方法“Int32 Parse(System.String)”,因此该方法无法转换为存储表达式。
private sys_User GetUserInfo() { sys_User model = null; var userId = Convert.ToInt32(AccountHelper.G ...
- Linq to entities 学习笔记
Linq to entities ---提供语言集成查询支持用于在概念模型中定义的实体类型. 首先可以根据http://msdn.microsoft.com/en-us/data/jj206878该 ...
随机推荐
- iOS开发中的一些细节BUG的解决
这篇博客里我将不定期更新自己遇到的一些细节上的BUG,并提供解决方法,遇到同样问题的童鞋们可以参考交流一下. 1.关于tableView的tableHeaderView 请注意,我这里说的是table ...
- iOS 学习 - 5.UILabel设置行距
NSMutableAttributedString *arrString =[[NSMutableAttributedString alloc]initWithString:@"asdass ...
- iOS开发~UI布局(三)深入理解autolayout
一.概要 通过对iOS8界面布局的学习和总结,发现autolayout才是主角,autolayout是iOS6引入的新特性,当时还粗浅的学习了下,可是没有真正应用到项目中.随着iOS设备尺寸逐渐碎片化 ...
- 通过JAVA反射,调用未知类的类方法
下面是一个比较简单的通过JAVA的反射机制调用已知方法的例子 package com.togeek.mvntest; import java.lang.reflect.InvocationTarget ...
- openstack问题汇总
No tenant network is available for allocation. No tenant network is available for allocation. 这个问 ...
- Android keystore 密码忘记了的找回办法
keystore密码忘记了,准备给自己的应用发布一个新版本,在apk打包时,发现之前的用的keystore密码忘了.如果换一个keystore,则之前已经安装应用的用户就必须手工卸载原应用才能安装,非 ...
- 我的Windows核心编程——完成端口+套接字 图解
========================声明============================ 本文原创,转载请注明作者和出处,并保证文章的完整性(包括本声明). 本文不定期修改完善,为 ...
- Java读写文件方法总结
Java读写文件方法总结 Java的读写文件方法在工作中相信有很多的用处的,本人在之前包括现在都在使用Java的读写文件方法来处理数据方面的输入输出,确实很方便.奈何我的记性实在是叫人着急,很多时候既 ...
- Hibernate基于注解方式配置来实现实体和数据库之间存在某种映射关系
实体和数据库之间存在某种映射关系,hibernate根据这种映射关系完成数据的存取.在程序中这种映射关系由映射文件(*.hbm.xml)或者java注解(@)定义. 本文以java注解的形式总结映射关 ...
- centos7 + php7 lamp全套最新版本配置,还有mongodb和redis
我是个懒人,能yum就yum啦 所有软件的版本一直会升级,注意自己当时的版本是不是已经更新了. 首先装centos7 如果你忘了设置swap分区,下面的文章可以教你怎么补一个上去: http://ww ...