Как преобразовать DBQuery <T> в ObjectQuery <T>?
У меня есть DBQuery<T>
, который преобразуется в IQueryable<T>
(этот бит отлично работает). Но затем я пытаюсь преобразовать IQueryable в ObjectQuery.., который не выполняется: -
public void Foo(this IQueryable<T> source)
{
// ... snip ...
ObjectQuery<T> objectQuery = source as ObjectQuery<T>;
if (objectQuery != null)
{
// ... do stuff ...
}
}
Это работало до того, как я перешел на Entity-Framework 4 CTP5 Magic Unicorn blah blah blah. Теперь он не работает - т.е. objectQuery
- null
.
Теперь DBQuery<T> inherits IQueryable<T>
.. поэтому я думал, что это должно сработать.
Если я изменил код на.
var x = (ObjectQuery<T>) source;
то генерируется следующее исключение: -
System.InvalidCastException: невозможно выполнить литой объект типа 'System.Data.Entity.Infrastructure.DbQuery 1[Tests.Models.Order]'
to type
'System.Data.Objects.ObjectQuery
1 [Tests.Models.Order]'.
Любые предложения?
Ответы
Ответ 1
DbQuery<T>
содержит метод Include
, поэтому вам не нужно преобразовывать его в ObjectQuery
. ObjectQuery
недоступен из экземпляра DbQuery
- он завернут во внутренний тип InternalQuery
, и оператор преобразования не определен.
Btw. при добавлении using System.Data.Entity
и refrence CTP5 вы сможете вызвать Include
на IQueryable<T>
!
Ответ 2
Используя отражение, вы можете сделать это:
var dbQuery = ...;
var internalQueryField = dbQuery.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).FirstOrDefault(f => f.Name.Equals("_internalQuery"));
var internalQuery = internalQueryField.GetValue(dbQuery);
var objectQueryField = internalQuery.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).FirstOrDefault(f => f.Name.Equals("_objectQuery"));
// Here your ObjectQuery!
var objectQuery = objectQueryField.GetValue(internalQuery) as ObjectQuery<T>;
Ответ 3
Не уверен, что вы пытаетесь с ним сделать, но может ли справка dynamic
?
Использование динамического типа (Руководство по программированию на С#)