Почему вы закрываете соединение, прежде чем начали читать из ридера?Считыватель похож на курсор - он не буферизует все результаты в памяти, когда вы открываете его, но загружает их постепенно, чтобы вы могли легко разорвать соединение (и функции чтения), прежде чем прочитать какой-либо результат.Вам не нужно явно закрывать соединение - это ответственность блока 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
, вам не нужноEntityCommand
и EntityDataReader
на всех.