2011-01-22 5 views
12

मुझे DBQuery<T> मिला है जो IQueryable<T> में परिवर्तित हो जाता है (यह बिट ठीक काम करता है)। लेकिन तब मैं एक ObjectQuery को IQueryable कन्वर्ट करने के लिए कोशिश कर रहा हूँ .. जो विफल रहता है: -मैं एक ऑब्जेक्टिव <T> पर एक DBQuery <T> कैसे परिवर्तित कर सकता हूं?

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

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

यह इससे पहले कि मैं इकाई-फ्रेमवर्क 4 CTP5 जादू यूनिकॉर्न, ऐसा ऐसा में बदला काम करता था। अब, यह काम नहीं कर रहा है - यानी। objectQuerynull है।

अब, 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 [टेस्ट.मोडल्स.ऑर्डर] '।

कोई सुझाव?

+1

तुम क्यों ObjectQuery करने के लिए इसे कास्ट करने के लिए की जरूरत है? – anon

+0

मुझे लगता है कि आपको एक ऐसी विधि की आवश्यकता होगी जो एक DBQuery लेता है और ऑब्जेक्टQuery बनाता है। वह या एक स्पष्ट रूपांतरण। मुझे एहसास है कि उनमें से एक दर्द है, यद्यपि। –

+1

यह एक दिलचस्प सवाल है। DbQuery ऑब्जेक्टक्वायर के साथ सीधा संबंध नहीं है, DbContext बनाम ऑब्जेक्ट कॉन्टेक्स्ट के विपरीत। मुझे संदेह है कि प्रत्यक्ष रूपांतरण संभव है। दोबारा, आपको फिर से जांच करनी चाहिए कि आपको पहली जगह में कास्ट की जरूरत क्यों है। इसके अलावा, "स्रोत" कहां से आ रहा है? – anon

उत्तर

15

DbQuery<T> ताकि आप ObjectQuery में बदलने की जरूरत नहीं है Include विधि में शामिल है। ObjectQueryDbQuery उदाहरण से उपलब्ध नहीं है - यह आंतरिक प्रकार InternalQuery में लपेटा गया है और रूपांतरण ऑपरेटर परिभाषित नहीं किया गया है।

बीटीडब्ल्यू। जब आप using System.Data.Entity जोड़ते हैं और सीटीपी 5 को रिफ्रेंस करते हैं तो आप पर IQueryable<T> पर कॉल करने में सक्षम होंगे!

+0

कोई रास्ता नहीं! विकीड :) यह निश्चित रूप से करता है! वास्तव में, int सीटीपी 5 सिस्टम में है। डेटा.एन्टी.डीबी एक्सटेंशन नामस्थान! और कोड मेरे ईएफ 3.5 कोड के लिए बिल्कुल (कम या ज्यादा) है। (मैंने अपना ऑब्जेक्टसेट 'ऑब्जेक्टसेट' के विस्तार विधियों को बनाया है (एर .. मुझे लगता है कि यह 'ऑब्जेक्टसेट' था ..) दोस्त - बहुत धन्यवाद! जीत जीत जीत ... –

0

सुनिश्चित नहीं है कि आप इसके साथ क्या करने का प्रयास कर रहे हैं, लेकिन dynamic परिवर्तनीय सहायता होगी?

Using Type dynamic (C# Programming Guide)

+0

मुझे ऐसा नहीं लगता है, क्योंकि मुझे ऑब्जेक्टQuery होना चाहिए, इसलिए मैं इसमें शामिल विधि तक पहुंच प्राप्त कर सकता हूं। –

11

प्रतिबिंब का उपयोग करना, आप यह कर सकते हैं:

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>; 
संबंधित मुद्दे

 संबंधित मुद्दे