2011-01-22 28 views
12

Tôi có một số DBQuery<T> chuyển đổi thành IQueryable<T> (bit này hoạt động tốt). Nhưng sau đó tôi đang cố gắng để chuyển đổi các IQueryable một ObjectQuery .. mà không: -Làm cách nào tôi có thể chuyển đổi một DBQuery <T> thành một ObjectQuery <T>?

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

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

này đã từng làm việc trước khi tôi thay đổi theo để Entity Framework 4-CTP5 kỳ diệu Unicorn blah blah blah. Bây giờ, nó không hoạt động - tức là. objectQuerynull.

Hiện tại, DBQuery<T> inherits IQueryable<T> .. vì vậy tôi nghĩ điều này sẽ hiệu quả.

Nếu tôi thay đổi mã để ..

var x = (ObjectQuery<T>) source; 

thì ngoại lệ sau đây được ném: -

System.InvalidCastException: Không thể đối tượng dàn diễn viên của loại 'System.Data. Entity.Infrastructure.DbQuery 1[Tests.Models.Order]' to type 'System.Data.Objects.ObjectQuery 1 [Tests.Models.Order] '.

Mọi đề xuất?

+1

Tại sao bạn cần phải cast nó để ObjectQuery? – anon

+0

Tôi nghĩ rằng bạn sẽ cần một phương pháp mà có một DBQuery và xây dựng một ObjectQuery. Đó hoặc một chuyển đổi rõ ràng. Tuy nhiên, tôi nhận ra một trong số đó là một nỗi đau. –

+1

Đây là một câu hỏi thú vị. DbQuery không có mối quan hệ trực tiếp với ObjectQuery, không giống DbContext vs ObjectContext. Tôi nghi ngờ rằng một chuyển đổi trực tiếp là có thể. Một lần nữa, bạn nên kiểm tra lại lý do tại sao bạn cần dàn diễn viên ngay từ đầu. Ngoài ra, đâu là "nguồn" đến từ đâu? – anon

Trả lời

15

DbQuery<T> chứa Include phương pháp do đó bạn không cần phải chuyển đổi để ObjectQuery. Không thể truy cập ObjectQuery từ trường hợp DbQuery - gói được bao bọc trong loại nội bộ InternalQuery và toán tử chuyển đổi không được xác định.

Btw. khi bạn thêm using System.Data.Entity và refrence CTP5, bạn sẽ có thể gọi Include trên IQueryable<T>!

+0

không có cách nào! wikid :) Chắc chắn rồi! Trong thực tế, int trong CTP5 System.Data.Entiy.DbExtensions không gian tên! Và mã là (nhiều hơn hoặc ít hơn) chính xác những gì tôi đã có cho mã EF 3.5 của tôi. (Tôi đã thực hiện riêng của mình Bao gồm các phương pháp mở rộng của 'ObjectSet' (er .. tôi nghĩ rằng đó là' ObjectSet' ..) Dude - THANKS SO MUCH! Giành chiến thắng giành chiến thắng giành chiến thắng ... –

0

Bạn không chắc chắn mình đang cố gắng làm gì với nó, nhưng có thể trợ giúp biến số dynamic không?

Using Type dynamic (C# Programming Guide)

+0

Tôi không nghĩ vậy, bởi vì tôi cần có một ObjectQuery để tôi có thể truy cập vào phương thức Include, trên đó. –

11

Sử dụng phản chiếu, bạn có thể làm điều này:

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>; 
Các vấn đề liên quan