2011-01-22 28 views
12

Tengo un DBQuery<T> que se convierte en IQueryable<T> (este bit funciona bien). Pero entonces yo estoy tratando de convertir el IQueryable a un ObjectQuery .. lo que falla: -¿Cómo puedo convertir un DBQuery <T> en un ObjectQuery <T>?

public void Foo(this IQueryable<T> source) 
{ 
    // ... snip ... 

    ObjectQuery<T> objectQuery = source as ObjectQuery<T>; 
    if (objectQuery != null) 
    { 
     // ... do stuff ... 
    } 
} 

Esto solía trabajar antes de que cambiara a Entidad-Framework 4 CTP5 magia del unicornio, bla, bla, bla,. Ahora, no está funcionando, es decir. objectQuery es null.

Ahora, DBQuery<T> inherits IQueryable<T> .. así que pensé que esto debería funcionar.

si cambio el código para ..

var x = (ObjectQuery<T>) source; 

entonces la excepción siguiente: -

System.InvalidCastException: No se puede fundido objeto de tipo 'System.Data. Entity.Infrastructure.DbQuery 1[Tests.Models.Order]' to type 'System.Data.Objects.ObjectQuery 1 [Tests.Models.Order] '.

¿Alguna sugerencia?

+1

¿Por qué necesita para su emisión a ObjectQuery? – anon

+0

Creo que vas a necesitar un método que tome DBQuery y construya un ObjectQuery. Eso o una conversión explícita. Sin embargo, me doy cuenta de que uno de esos es un dolor. –

+1

Esta es una pregunta interesante. DbQuery no tiene una relación directa con ObjectQuery, a diferencia de DbContext vs ObjectContext. Dudo que una conversión directa sea posible. De nuevo, deberías volver a examinar por qué necesitas el yeso en primer lugar. Además, ¿de dónde viene la "fuente"? – anon

Respuesta

15

DbQuery<T> contiene Include método de modo que no es necesario para convertir a ObjectQuery. ObjectQuery no se puede acceder desde la instancia DbQuery - está envuelto en el tipo interno InternalQuery y el operador de conversión no está definido.

Btw. cuando agrega using System.Data.Entity y refiera CTP5, podrá llamar al Include en IQueryable<T>!

+0

de ninguna manera! wikid :) ¡Seguro! De hecho, int está en el espacio de nombres CTP5 System.Data.Entiy.DbExtensions! Y el código es (más o menos) exactamente lo que tenía para mi código EF 3.5. (Hice mis propios métodos de extensión Include de 'ObjectSet' (er .. creo que fue' ObjectSet'' ..) Dude - GRACIAS TANTO! Win win win ... –

0

No estoy seguro de lo que está tratando de hacer con él, pero ¿sería útil una variable dynamic?

Using Type dynamic (C# Programming Guide)

+0

No lo creo, porque necesito tener un ObjectQuery para poder acceder al método Include en él. –

11

El uso de la reflexión, se puede hacer esto:

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>; 
Cuestiones relacionadas