C# 4.0 EntityDataReader到ToList()
我的代码:C# 4.0 EntityDataReader到ToList(),c#-4.0,entity-framework-4,linq-to-entities,C# 4.0,Entity Framework 4,Linq To Entities,我的代码: public List<Book> GetBook(string Field, object Value) { using (EntityConnection conn = new EntityConnection("name=Entities")) { conn.Open(); // Create an EntityCommand. using (EntityCommand cmd = conn.Crea
public List<Book> GetBook(string Field, object Value)
{
using (EntityConnection conn = new EntityConnection("name=Entities"))
{
conn.Open();
// Create an EntityCommand.
using (EntityCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "Select VALUE b FROM Entities.Book as b where Cast(b." + Field + " as Edm.String) like '%" + Value.ToString() + "%'";
// Execute the command.
using (EntityDataReader rdr =
cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
conn.Close();
var s = from d in rdr.OfType<Book>().AsEnumerable()
select d;
return (s.ToList());
}
}
}
return (null);
}
公共列表GetBook(字符串字段,对象值)
{
使用(EntityConnection conn=新的EntityConnection(“名称=实体”))
{
conn.Open();
//创建EntityCommand。
使用(EntityCommand cmd=conn.CreateCommand())
{
cmd.CommandText=“从Entities.Book中选择值b作为b,并在其中强制转换(b.“+Field+”作为Edm.String),如“%”“+VALUE.ToString()+“%””;
//执行命令。
使用(EntityDataReader rdr)=
cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
康涅狄格州关闭();
var s=来自rdr.OfType()中的d.AsEnumerable()
选择d;
返回(s.ToList());
}
}
}
返回(空);
}
为什么结果总是空的
正确的代码是什么?为什么在开始阅读阅读器之前要关闭连接?读卡器就像游标一样——当您打开它时,它不会将所有结果缓冲到内存中,但它会以增量方式加载它们,这样您就可以在读取任何结果之前轻松地终止连接(以及读取功能)。您不必显式地关闭连接-这是
使用
块的责任
您还可以使用SQL profiler来验证它是否真正构建了您期望的查询
using (EntityConnection conn = new EntityConnection("name=Entities"))
{
conn.Open();
// Create an EntityCommand.
using (EntityCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "Select VALUE b FROM Entities.Book as b where Cast(b." + Field + " as Edm.String) like '%" + Value.ToString() + "%'";
// Execute the command.
using (EntityDataReader rdr =
cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
var s = from d in rdr.OfType<Book>().AsEnumerable()
select d;
return (s.ToList());
}
}
}
使用(EntityConnection conn=新的EntityConnection(“名称=实体”))
{
conn.Open();
//创建EntityCommand。
使用(EntityCommand cmd=conn.CreateCommand())
{
cmd.CommandText=“从Entities.Book中选择值b作为b,并在其中强制转换(b.“+Field+”作为Edm.String),如“%”“+VALUE.ToString()+“%””;
//执行命令。
使用(EntityDataReader rdr)=
cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
var s=来自rdr.OfType()中的d.AsEnumerable()
选择d;
返回(s.ToList());
}
}
}
s.ToList().Count
返回0,因为rdr.OfType
始终是空集合EntitDataReader
并没有具体化实体——它只是与数据库相关的DataReader
的包装器,并且以同样的方式工作。必须读取列并将其填充到实体的属性中
如果你不想这样做,你可以使用
objectContext.Translate
方法,但一旦你开始使用objectContext
你就不需要EntityCommand
和EntityDataReader
。为什么总是s.ToList().Count=0?我不知道为什么。我的问题是:为什么总是s.ToList().Count=0?