Как я могу преобразовать 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 бла-бла-бла. Теперь это не работает - т.е. 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]".
Какие-либо предложения?
3 ответа
DbQuery<T>
содержит Include
метод, поэтому вам не нужно конвертировать в ObjectQuery
, ObjectQuery
недоступен из DbQuery
экземпляр - оборачивается во внутренний тип InternalQuery
и оператор преобразования не определен.
Btw. когда вы добавляете using System.Data.Entity
а по ссылке CTP5 вы сможете звонить Include
на IQueryable<T>
!
Используя рефлексию, вы можете сделать это:
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's your ObjectQuery!
var objectQuery = objectQueryField.GetValue(internalQuery) as ObjectQuery<T>;
Не уверен, что вы пытаетесь сделать с этим, но будет dynamic
переменная помощь?
Использование динамического типа (Руководство по программированию в C#)