EF5 ObjectResult для ObjectQuery имеет значение null?

Я пытаюсь получить строку запроса с параметрами для целей отладки из структуры сущностей. Нет, я не буду использовать EFProfiler, потому что строки запроса должны быть видны как выходные данные на странице. Большинство этих запросов пишутся вручную с помощью ExecuteStoredQuery(). Однако приведение их к ObjectQuery дает значение null.

Пример:

ObjectResult<Parent> model = _context.ObjectContext().ExecuteStoreQuery<Parent>("SELECT * FROM Parents");
var objectQuery = model.AsQueryable() as ObjectQuery<Parent>;

объектный запрос равен нулю. ObjectContext() — это простой метод в контексте данных, который выглядит так:

return (this as IObjectContextAdapter).ObjectContext;

Я исчерпал свои собственные идеи, и все, что было найдено в результате поиска,... ну, бесполезно, потому что, кажется, никто не понимает этой проблемы. Имейте в виду, результаты возвращаются правильно из запроса.

Редактировать: Правильно, я должен был упомянуть и об этом.

Делая это:

var oq = m as ObjectQuery<Parent>;

Дает мне это:

Не удается преобразовать тип «System.Data.Objects.ObjectResult» в «System.Data.Objects.ObjectQuery» посредством преобразования ссылки, преобразования упаковки, преобразования распаковки, преобразования упаковки или преобразования нулевого типа.

Откуда, когда я подумал, что нужно использовать AsQueryable(), который, ну... нулевой по очевидным причинам. Это моя усталая голова забыла добавить эту маленькую деталь.


person NeroS    schedule 06.02.2013    source источник


Ответы (3)


Я думаю, что другие ответы ясно дали понять, что вы не можете преобразовать ObjectResult<T> в ObjectQuery<T>. Но мне интересен ваш комментарий

Я попробовал CreateQuery и столкнулся с проблемами. Во-первых, не нравится, когда пользователь пытается SELECT *, кажется, вам нужно указать все поля, которые вам нужно получить.

Вы можете использовать ObjectQuery для поиска "*":

ObjectContext().ObjectQuery<Parent>("SELECT VALUE par FROM Parents AS par")

Как видите, в строке запроса нет фактического *, а в строке трассировки нет *, но показаны все поля. Но вам не нужно указывать все поля для построения строки запроса. Надеюсь, это поможет вам лучше использовать ObjectQuery.

person Gert Arnold    schedule 06.02.2013
comment
Я думаю, вы имеете в виду can´t cast вместо can cast? - person Jehof; 07.02.2013

Ваш бросок as ObjectQuery<Parent> неверен, потому что ObjectResult<Parent>.AsQueryable() вернет IQueryable<Parent>, который не относится к типу ObjectQuery<Parent>.

AsQueryable — это метод расширения класса Queryable, который преобразует IEnumerable в IQueryable.

В результате ваша переменная objectQuery имеет значение null.

person Jehof    schedule 06.02.2013
comment
Я обновил исходный вопрос этой забытой деталью, это не позволяет мне использовать исходный m как объектный запрос. - person NeroS; 06.02.2013

Конечно, вы ДЕЙСТВИТЕЛЬНО хотите использовать CreateQuery (sql), а не ExecuteStoreQuery (sql).

Учитывая имя, ExecuteStoreQuery фактически запускает SQL, в то время как CreateQuery возвращает ObjectQuery, готовый к отправке в базу данных.

Очевидно, вы можете затем вызвать Execute для ObjectQuery, чтобы вернуть ObjectResult.

person Aron    schedule 06.02.2013
comment
Я попробовал CreateQuery и столкнулся с проблемами. Во-первых, не нравится, когда пользователь пытается SELECT *, вам как бы приходится указывать все поля, которые нужно получить (что неприемлемо с точки зрения приложения). Кроме того, все примеры, которые я видел, которые позволяют использовать ToTraceString(), использовали ExecuteStoreQuery(), а затем приводили это к ObjectQuery:/ Я не совсем уверен, что происходит на бэкэнде. - person NeroS; 07.02.2013