如何for循环查询数据库ilist新增到数据库中

Entity Framework中IQueryable, IEnumerable, IList的区别[转]
时间: 14:54:55
&&&& 阅读:148
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&
使用Entity Framework等ORM框架的时候,SQL对于使用者来说是透明的,往往很多人也不关心ORM所生成的SQL,然而系统出现性能问题的时候就必须关注生成的SQL以发现问题所在。
使用过Toplink的朋友知道很只要设置日志打印级别=FINE就可以配置使之生成的SQL在服务器中打印出来,Entiry Framework没有那么幸运,在以前要检测生成SQL的唯一方法是SQL Server Profiler,但使用起来并不方便,结果也不能自动保存到文件中。
是Entity Framework Team新推出的开源SQL追踪和二级缓存的解决方案。原理是在负责执行具体SQL语句的data provider(SqlClient或者其他Client)之上插入了一层WrappingProvider,用于监控DbCommand.ExecuteReader(), ExecuteScalar() and ExecuteNonQuery(),将Sql命令输出到指定介质或者将查询结果缓存起来以重用。
使用方法很简单,下载源代码编译后将dll添加到项目中,新加一个类WrappedNorthWindEntities继承原有的Entities即可,详见源代码中的示例。
测试IQueryable, IEnumerable, IList的区别
下面我们使用EF Wrapper来监测Entify Framework中IQueryable, IEnumerable和IList所生成的SQL。
TestIQueryable
private static void TestIQueryable()
using (var ctx = new WrappedNorthWindEntities())
IQueryable&Product& expression = ctx.Products.Take(5);
IQueryable&Product& products = expression.Take(2);
Console.WriteLine(products.Count());          // B SELECT COUNT(1) FROM ( SELECT TOP (2) * FROM ( SELECT TOP (5) * FROM [dbo].[Products] ))
Console.WriteLine(products.Count());          // C
SELECT COUNT(1) FROM ( SELECT TOP (2) * FROM ( SELECT TOP (5) * FROM [dbo].[Products] ))
foreach (Product p in products)             // D
SELECT TOP (2) * FROM ( SELECT TOP (5) * FROM [dbo].[Products]
Console.WriteLine(p.ProductName);
foreach (Product p in products)            
SELECT TOP (2) * FROM ( SELECT TOP (5) * FROM [dbo].[Products] )
Console.WriteLine(p.ProductName);
TestIEnumerable
private static void TestIEnumerable()
using (var ctx = new WrappedNorthWindEntities())
IEnumerable&Product& expression = ctx.Products.Take(5).AsEnumerable();
IEnumerable&Product& products = expression.Take(2);
Console.WriteLine(products.Count());          // B SELECT TOP (5) * FROM [dbo].[Products]
Console.WriteLine(products.Count());          // C
SELECT TOP (5) * FROM [dbo].[Products]
foreach (Product p in products)             // D
SELECT TOP (5) * FROM [dbo].[Products]
Console.WriteLine(p.ProductName);
foreach (Product p in products)            
SELECT TOP (5) * FROM [dbo].[Products]
Console.WriteLine(p.ProductName);
private static void TestIList()
using (var ctx = new WrappedNorthWindEntities())
var expression = ctx.Products.Take(5);
IList&Product& products = expression.Take(2).ToList(); // A
SELECT TOP (2) * FROM ( SELECT TOP (5) * FROM [dbo].[Products]
Console.WriteLine(products.Count());          
// B 不执行SQL
Console.WriteLine(products.Count());          
foreach (Product p in products)             
Console.WriteLine(p.ProductName);
foreach (Product p in products)            
Console.WriteLine(p.ProductName);
IQueryable和IEnumerable都是延时执行(Deferred Execution)的,而IList是即时执行(Eager Execution)
IQueryable和IEnumerable在每次执行时都必须连接数据库读取,而IList读取一次后,以后各次都不需连接数据库。前两者很容易造成重复读取,性能低下,并且可能引发数据不一致性
IQueryable和IEnumerable的区别:IEnumberalb使用的是LINQ to Object方式,它会将AsEnumerable()时对应的所有记录都先加载到内存,然后在此基础上再执行后来的Query。所以上述TestIEnumerable例子中执行的SQL是"select top(5) ...",然后在内存中选择前两条记录返回。
以下是一个IQueryable引发数据不一致性的例子:记录总数和记录详情两者本应一致,但由于IQueryable前后两次读取数据库,结果是现实有10条记录,却输出11条详情。
IQueryable Data Inconsistancy
IQueryable&Product& products = ctx.Products.All();
//开始的时候数据库product表中有10条记录, count = 10
int count = products.Count();
Console.WriteLine("Count of products:"+count);
//此时另一进程添加一个产品进数据库
//会重新读取数据库并输出11个产品名称
foreach (Product p in products)
Console.WriteLine(p.ProductName);
基于性能和数据一致性这两点,我们使用IQueryable时必须谨慎,而在大多数情况下我们应使用IList。
当你打算马上使用查询后的结果(比如循环作逻辑处理或者填充到一个table/grid中),并且你不介意该查询会即时执行,使用ToList()
当你希望查询后的结果可以供调用者(Consummer)作后续查询(比如这是一个"GetAll"的方法),或者你希望该查询延时执行,使用AsQueryable()
IQueryable接口与IEnumberable接口的区别:& IEnumerable&T& 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable&T& 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:/xbblogs/p/5192649.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!怎的遍历一个ILIST集合 并将其所有的数据插入到表中 - C#当前位置:& &&&怎的遍历一个ILIST集合 并将其所有的数据插入到表中怎的遍历一个ILIST集合 并将其所有的数据插入到表中&&网友分享于:&&浏览:229次怎样遍历一个ILIST集合 并将其所有的数据插入到表中怎样遍历一个ILIST集合&并将其所有的数据插入到&表中------最佳解决方案--------------------IList&tiankongti&&timu&=&new&List&tiankongti&();
SqlConnection&conn&=&DBHelper.Getconn();
conn.Open();
foreach&(tiankongti&tq&in&timu&)&&&
&&strinq&strSQL="insert&into&table1()&values('"+&tk.id+"','+tk.Timu+"')";
&&SqlCommand&com&=&new&SqlCommand(sql,&conn);
&&com.ExecuteNonQuery();&
conn.Close();------其他解决方案--------------------LIST&Sring&&lis=new&LIST&String&();
&foreach&(String&var&in&lis)
&&&&&&&&&&&&var就是里面每项的值
&&&&&&&&}------其他解决方案--------------------第一种&ILIST&String&&list=new&LIST&String&();
&foreach&(String&var&in&list)
&&var就是里面每项的值
第二种&ILIST&Object&&list=new&LIST&Object&();
&foreach&(Object&obj&in&list)
&&obj//对象的值
推介下自己的网站&谢谢------其他解决方案--------------------List&T&&lst=new&List&T&();
foreach(T&t&in&lst)
}------其他解决方案--------------------大家把代码写完整一点&------其他解决方案--------------------引用:List&T&&lst=new&List&T&();
foreach(T&t&in&lst)
}&up------其他解决方案--------------------高山流水厉害!------其他解决方案--------------------谁能在高山流水的基础上&&运用加参数的方式啊?------其他解决方案--------------------IList&tiankongti&&timu&=&new&List&tiankongti&();
SqlConnection&conn&=&DBHelper.Getconn();
conn.Open();
foreach&(tiankongti&tq&in&timu&)&&&
&&strinq&strSQL=string.Format("insert&into&table1('列1','列2','列3')&values('{0}','{1}','{2}')",timu[i].属性,timu[i].属性1,timu[i].属性2);
&&SqlCommand&com&=&new&SqlCommand(sql,&conn);
&&com.ExecuteNonQuery();&
conn.Close();------其他解决方案--------------------strinq&strSQL=string.Format("insert&into&table1('列1','列2','列3')&values('{0}','{1}','{2}')",timu[i].属性,timu[i].属性1,timu[i].属性2);
好像我少写了一个半括号改为:
strinq&strSQL=string.Format("insert&into&table1('列1','列2','列3')&values('{0}','{1}','{2}')",timu[i].属性,timu[i].属性1,timu[i].属性2));------其他解决方案--------------------示例:
&string&sql&=&"select&*&from&l_data_chukou";
&&&&&&&&&&&&string&a&=&this.cboBegan.T
&&&&&&&&&&&&ck&=&new&List&ChuKou4&(); 共&2&页:
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下载作业帮安装包
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
如何获取Ilist集合中的一列值我把数据库中的信息读到List集合中,在后台代码中我想获取List中的某一列值
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
string value=string.Eif (ilist != null){value=ilist[i].Tostring(); }//i是你要的那一列的索引
为您推荐:
其他类似问题
扫描下载二维码如何利用循环从数据库中向combobox中添加数据?
如何利用循环从数据库中向combobox中添加数据?
08-12-31 &
comboBox1.DataSource = 数据源(DataSet,List&&,IList&&)均可//绑定数据源,范型 comboBox1.DisplayMember= &TypeName&; //绑定每一列显示值,当前需要显示的值 comboBox1.ValueMember = &TypeID&; //绑定每一列对应值,ID 完全不用去循环它,就这样几句就搞定了.
请登录后再发表评论!

我要回帖

更多关于 php循环输出数据库 的文章

 

随机推荐