2011-09-01 32 views
2

我的代码:EntityDataReader到ToList()

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); 
} 

为什么结果总是空???

什么是正确的代码?

回答

2

为什么在开始阅读之前关闭连接?阅读器就像游标 - 它不会将所有结果缓存到内存中,但它会逐渐加载它们,因此您可以在读取任何结果之前轻松终止连接(以及读取功能)。您不必明确关闭连接 - 这是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()); 
     } 
    } 
} 

s.ToList().Count返回0,因为rdr.OfType<Book>总是空的集合。 EntitDataReader没有实现实体 - 它只是包装数据库相关的DataReader,它的工作方式相同。您必须阅读专栏并将其填写到实体的属性中。

如果你不想这样做,你可以使用objectContext.Translate方法,但一旦你开始使用ObjectContext工作,你不需要EntityCommandEntityDataReader可言。

+0

请让我看看正确的代码 – mrJack

+0

为什么总是s.ToList()。Count = 0? – mrJack

+1

我加了它不起作用的原因。 –