EF5 ObjectResult към ObjectQuery е нула?

Опитвам се да получа низа на заявката с параметри за целите на отстраняване на грешки от рамката на обекта. Не, няма да използвам EFProfiler, защото низовете на заявката трябва да са видими като изход на страницата. Повечето от тези заявки се пишат ръчно с помощта на ExecuteStoredQuery(). Прехвърлянето им към ObjectQuery обаче дава нула.

Пример:

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

objectQuery е нула. 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 и срещнах проблеми с него. От една страна, не харесва, когато потребителят се опитва да ИЗБЕРЕ *, изглежда, че трябва да посочите всички полета, които трябва да получите.

Можете да използвате 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 е нула.

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 и срещнах проблеми с него. От една страна, не харесва, когато потребителят се опитва да ИЗБЕРЕ *, изглежда, че трябва да посочите всички полета, които трябва да получите (което е неприемливо от гледна точка на приложението). В допълнение, всички примери, които съм виждал, които позволяват използването на ToTraceString() са използвали ExecuteStoreQuery() и след това са го прехвърляли към ObjectQuery :/ Не съм съвсем сигурен какво се случва в задния край. - person NeroS; 07.02.2013