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?