2010-08-09 17 views
18

मैं आगे कहूंगा कि मैं गतिशील डेटा पर linq के साथ कुछ वाकई डरावनी चीजें कर रहा हूं। लेकिन मैं समझ नहीं क्यों इस क्वेरी को संकलित करने में विफल रहता है:गतिशील + linq संकलन त्रुटि

त्रुटि 1 संपत्ति '<> h__TransparentIdentifier0' प्रकार तर्क के साथ नहीं किया जा सकता

 
public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var docs = new dynamic[0]; 
     var q = from doc in docs 
       where doc["@metadata"]["Raven-Entity-Name"] == "Cases" 
       where doc.AssociatedEntities != null 
       from entity in doc.AssociatedEntities 
       where entity.Tags != null // COMPILER ERROR HERE 
       from tag in entity.Tags 
       where tag.ReferencedAggregate != null 
       select new {tag.ReferencedAggregate.Id, doc.__document_id}; 
    } 
} 

public static class LinqOnDynamic 
{ 
    private static IEnumerable<dynamic> Select(this object self) 
    { 
     if (self == null) 
      yield break; 
     if (self is IEnumerable == false || self is string) 
      throw new InvalidOperationException("Attempted to enumerate over " + self.GetType().Name); 

     foreach (var item in ((IEnumerable) self)) 
     { 
      yield return item; 
     } 
    } 

    public static IEnumerable<dynamic> SelectMany(this object source, 
                Func<dynamic, int, IEnumerable<dynamic>> collectionSelector, 
                Func<dynamic, dynamic, dynamic> resultSelector) 
    { 
     return Enumerable.SelectMany(Select(source), collectionSelector, resultSelector); 
    } 

    public static IEnumerable<dynamic> SelectMany(this object source, 
                Func<dynamic, IEnumerable<dynamic>> collectionSelector, 
                Func<dynamic, dynamic, dynamic> resultSelector) 
    { 
     return Enumerable.SelectMany(Select(source), collectionSelector, resultSelector); 
    } 

    public static IEnumerable<dynamic> SelectMany(this object source, 
                Func<object, IEnumerable<dynamic>> selector) 
    { 
     return Select(source).SelectMany<object, object>(selector); 
    } 

    public static IEnumerable<dynamic> SelectMany(this object source, 
                    Func<object, int, IEnumerable<dynamic>> selector) 
    { 
     return Select(source).SelectMany<object, object>(selector); 

    } 
} 

चोट के अपमान जोड़ने के लिए, निम्न कार्य :

 
var docs = new dynamic[0]; 
var q = from doc in docs 
     where doc["@metadata"]["Raven-Entity-Name"] == "Cases" 
     where doc.AssociatedEntities != null 
     from entity in doc.AssociatedEntities 
     where entity.Tags != null 
     from tag in entity.Tags 
     select new { tag.ReferencedAggregate.Id, doc.__document_id }; 

यह केवल जब मैं जोड़ने है:

जहां tag.ReferencedAggregate = अशक्त

मैं एक त्रुटि दो पंक्तियों मिल यही कारण है कि पहले:

जहां entity.Tags = अशक्त // कंपाइलर त्रुटि यहाँ

सुनिश्चित नहीं हैं कि

उत्तर

12

मैं बस करने के लिए अपने कॉल परिवर्तित करने की कोशिश करते हैं:

'एक गतिशील करने के लिए एक तर्क के रूप में एक लैम्ब्डा अभिव्यक्ति का उपयोग नहीं कर सकता:

var q = from doc in docs.Where(doc => doc["@metadata"]["Raven-Entity-Name"] == "Cases" || doc.AssociatedEntities != null) 
     from entity in doc.AssociatedEntities.Where(entity => entity.Tags != null) 

मैं एक अलग संकलक त्रुटि जो शायद पता चलता है कि क्या हो रहा है मिल बिना किसी प्रतिनिधि या अभिव्यक्ति वृक्ष प्रकार '

पर कास्टिंग किए बिना प्रेषित ऑपरेशन तो मुझे लगता है कि आपको कहां ऑपरेटर अधिभार करना होगा।

+3

धन्यवाद, वह था। मैंने इकाई में टैग से का उपयोग करके इसे हल करना समाप्त कर दिया। टैग्स ((Func ) (t => t.ReferencedAggregate! = Null)) नरक के रूप में बदसूरत। मैंने विस्तार विधि लिखने की कोशिश की, लेकिन मुझे पता नहीं लगा कि सीएससी इसे कैसे स्वीकार कर सकता है। –

1

चल रहा है बेनामी प्रकार वापसी < है> h__TransparentIdentifier0 और संकलन समय पर संकलक द्वारा काम किया है - समस्या के लिए "पूर्वता के गतिशील आदेश" दिखाई देता है - यहां पढ़ लिया है: Method-missing difficulties in C# 4.0: dynamic vs RealProxy

मैं सिर्फ ar ऊपर काम कर यह आज माध्यम से चला गया ईसेंट पोस्ट मेरे पास एक छोटा सा अनुमान होगा और कहें कि अज्ञात प्रकार गतिशील असाइनमेंट के बाद तैयार किया गया है :) - संकलक यह जानता है और आपको विफल कर रहा है।

यदि आप नियमित प्रकार की वापसी का उपयोग करते हैं तो क्या समस्या दूर हो जाती है? मुझे लगता है कि यह जरूरी है।

+0

रोब, मुझे ऐसा नहीं लगता है। मुख्य समस्या यह है कि यह कई अन्य परिदृश्यों के लिए काम करता है। मुझे पता नहीं लगा सकता कि यह इसके लिए क्यों काम नहीं करता है। सभी LinqOnDynamic विधियां गतिशील के IENumerable लौटती हैं, इसलिए यह कोई समस्या नहीं होनी चाहिए। ऐसा लगता है कि यह एक विस्तार विधि के लिए मजबूत बाध्यकारी करने की कोशिश कर रहा है, लेकिन मुझे नहीं पता कि कैसे। –

+0

आह - गतिशील एक्सटेंशन का समर्थन नहीं करता है: http://stackoverflow.com/questions/258988/will-the-dynamic-keyword-in-c4-support-extension-methods मैं बिल्कुल नहीं कह सकता कि आप कहां हैं इसका उपयोग कर रहे हैं - लेकिन हाँ एक्सटेंशन तरीके समस्या हो सकती है। –

+0

यह वास्तव में गतिशील पर नहीं चल रहा है, यह गतिशील के IENumerable पर चलता है यह एक स्थिर प्रकार है, इसलिए इसमें विस्तार विधियां हो सकती हैं। –

2
 
var q = from doc in docs 
     where doc["@metadata"]["Raven-Entity-Name"] == "Cases" 
     where doc.AssociatedEntities != null 
     from entity in 
      ((IEnumerable<dynamic>)doc.AssociatedEntities) 
      .Where(entity => entity.Tags != null) 
     from tag in 
      ((IEnumerable<dynamic>)entity.Tags) 
      .Where(tag => tag.ReferencedAggregate != null) 
     select new { tag.ReferencedAggregate.Id, doc.__document_id }; 

यह थोड़ा बेहतर है। सही नहीं है, लेकिन यह शुरुआत की तरह है - आप लिम्बो में खोने से पहले ही इतने सारे स्तर गहरे जा सकते हैं।

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