2011-09-01 48 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

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