我的代码:
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);
}为什么结果总是空的?
正确的代码是什么?
发布于 2011-09-01 15:27:06
为什么在开始从阅读器读取之前关闭连接?Reader就像游标-当你打开它时,它不会把所有的结果都缓冲到内存中,但它会以增量的方式加载它们,这样你就可以在读取任何结果之前轻松地终止连接(以及读取功能)。您不必显式关闭连接-这是using块的职责。
您还可以使用SQL事件探查器来验证它是否真的构建了您期望的查询。
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());
}
}
}因为rdr.OfType<Book>总是空集合,所以s.ToList().Count返回0。EntitDataReader并不物化实体--它只是数据库相关DataReader的包装器,它的工作方式与此相同。您必须读取列并将它们填充到实体的属性中。
如果你不想这样做,你可以使用objectContext.Translate方法,但是一旦你开始使用ObjectContext,你就完全不需要EntityCommand和EntityDataReader了。
https://stackoverflow.com/questions/7266271
复制相似问题