2011-01-22 21 views
12

IQueryable<T> (bu bit iyi çalışıyor) dönüştüren bir DBQuery<T> var. Ama sonra başarısız olan .. Bir ObjectQuery için IQueryable dönüştürmek çalışıyorum: -Bir DBQuery <T>'u bir ObjectQuery <T>'a nasıl dönüştürebilirim?

Ben Varlık-Çerçeve 4 CTP5 Sihirli Unicorn falan filan üzerine değiştirildi önce bu işe alışık
public void Foo(this IQueryable<T> source) 
{ 
    // ... snip ... 

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

. Şimdi, çalışmıyor - yani. objectQuery, null.

Şimdi, DBQuery<T> inherits IQueryable<T> .. bu yüzden bunun işe yarayacağını düşündüm.

i kodu değiştirirseniz ..

var x = (ObjectQuery<T>) source; 

sonra aşağıdaki istisnası atılır: -

System.Web.HttpUnhandledException: tip 'System.Data ait döküm nesnesine edilemiyor. Entity.Infrastructure.DbQuery 1[Tests.Models.Order]' to type 'System.Data.Objects.ObjectQuery 1 [Tests.Models.Order] '.

Herhangi bir öneriniz var mı?

+1

Neden ObjectQuery için döküm gerekiyor? – anon

+0

Bir DBQuery alan ve bir ObjectQuery oluşturan bir yönteme ihtiyacınız olacağını düşünüyorum. Bu veya açık bir dönüşüm. Ben de bunlardan birinin acı olduğunu anlıyorum. –

+1

Bu ilginç bir soru. DbQuery, ObjectContext ile ObjectContext'den farklı olarak ObjectQuery ile doğrudan bir ilişkisi yoktur. Doğrudan bir dönüşümün mümkün olduğundan şüpheliyim. Yine, ilk etapta neden oyuncuya ihtiyacınız olduğunu tekrar gözden geçirmelisiniz. Ayrıca, "kaynak" nereden geliyor? – anon

cevap

15

DbQuery<T>Include yöntem içerir. ObjectQuery, DbQuery örneğinden erişilemez - iç türü InternalQuery ile paketlenmiştir ve dönüşüm işleci tanımlanmamıştır.

B

Btw. using System.Data.Entity ve CTP5'i tekrar eklediğinizde IQueryable<T> numaralı telefondan Include'u arayabilirsin! Yansıma kullanarak

+0

yol yok! wikid :) Kesinlikle öyle! Aslında, int CTP5 System.Data.Entiy.DbExtensions ad alanında! Ve kod (az ya da çok) benim EF 3.5 kod için tam olarak ne vardı. (ObjectSet'in kendi eklenti uzantı yöntemlerini yaptım (er .. Ben 'ObjectSet' olduğunu düşünüyorum ..) Dostum - TEŞEKKÜRLER! –

0

Ne yapmaya çalıştığınızdan emin değilsiniz, ancak dynamic değişken yardımı olur mu? Eğer ObjectQuery dönüştürmek gerek kalmaz

Using Type dynamic (C# Programming Guide)

+0

Bunu düşünmüyorum, çünkü bir ObjectQuery olması gerekiyor, bunun için Include yöntemine erişebiliyorum. –

11

, bunu yapabilirsiniz:

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>; 
İlgili konular