EntityDataReader to ToList () - PullRequest
       18

EntityDataReader to ToList ()

1 голос
/ 01 сентября 2011

мой код:

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

почему результат всегда пустой ???

Какой правильный код?

1 Ответ

2 голосов
/ 01 сентября 2011

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

...