2009-01-27 8 views
6

मूल विचार एक स्ट्रिंग लेना और एक्सएमएल फ़ाइल (या किसी भी LINQed प्रदाता)क्या एक स्ट्रिंग का मूल्यांकन करना संभव है जिसमें वैध LINQ गतिशील रूप से/रनटाइम पर है?

के खिलाफ इसका मूल्यांकन करना है, मुझे यह LINQ Dynamic Query Library मिला। प्रलेखन में बस एक सरसरी नज़र थी जो डाउनलोड बंडल में एक ही पृष्ठ है। ऐसा लगता है कि LINQ क्वेरी के कुछ हिस्सों को पैरामीटर करने के लिए एक्सटेंशन विधियां जोड़ रही हैं। क्या किसी को पता है कि क्या यह गतिशील मूल्यांकन करता है?

क्या ऐसा करने का कोई तरीका है (मान लें कि एक्सएमएल फ़ाइल से डेटा के साथ वर्ग को बीज करने का कोई तरीका है)?

ClassFromWishfulThinking.Evaluate(sLinqQuery); 
+0

मैंने आपके प्रश्न को वोट दिया, केवल इसलिए कि जब मैंने इसे देखा तो 1 पर बैठ गया। बिल्कुल यकीन नहीं है कि कोई आपके प्रश्न को क्यों वोट देगा ... – GregD

उत्तर

3

यह संभव होना चाहिए क्योंकि Linqpad ऐसा करता है!

how it works page को देखते हुए थोड़ा दिमाग झुकता है, और मुझे यकीन नहीं है कि यह ऐसा कुछ है जिसे आप उत्पादन कोड के साथ करना चाहते हैं जब तक कि आप वास्तव में इससे बच नहीं सकते।

कोई फ्रेमवर्क विधि नहीं है जो सिर्फ वही करता है जो मैं चाहता हूं, मैं कह सकता हूं कि नेटनेट कैसे काम करता है इसके कारण काफी उच्च आत्मविश्वास के साथ। आपको लिंकरपैड के रूप में csharpcodeprovider का उपयोग करके कंपाइलर को कॉल करना होगा।

आप जो भी चाहते हैं उसे करने के लिए आप लिंक डायनामिक क्वेरी लाइब्रेरी को बदल सकते हैं।

+0

यह उत्पादन कोड नहीं है .. बल्कि लिंककैड का एक साधारण संस्करण करने की कोशिश कर रहा है .. लेकिन एसक्यूएल के बजाय एक्सएमएल के खिलाफ। – Gishu

0

LinqToXml में से अधिकांश स्ट्रिंग द्वारा संचालित है। उदाहरण के लिए, Elements extension method एक स्ट्रिंग लेगा और उस नाम के साथ सभी बच्चे तत्वों को ढूंढ जाएगा।

यदि आपकी क्वेरी स्ट्रिंग के रूप में शुरू होती है (और क्विकेबल/एन्यूमेबल पर विधि कॉल के रूप में नहीं), तो यह वास्तव में एक linq क्वेरी नहीं है - लेकिन कुछ और। शायद XPath मदद कर सकते हैं।

2

मुझे यह कोड वीबी में रनटाइम पर एक स्ट्रिंग में निहित कोड का मूल्यांकन करने के लिए मिला है ... आपको इसे सी # में अनुवाद करने की आवश्यकता होगी, लेकिन ऐसा कोई कारण नहीं है कि आप केवल LINQ युक्त स्ट्रिंग में नहीं जा सकें अभिव्यक्ति। LINQ के उपयोग की अनुमति देने के लिए आपको FuncString को थोड़ा संशोधित करने की आवश्यकता होगी क्योंकि मैं केवल सिस्टम का संदर्भ देता हूं। गणित। मैं (ज्यादातर गणितीय) रनटाइम पर भाव के मूल्यांकन के लिए इसका इस्तेमाल करते हैं, लेकिन मुझे लगता है इसे संशोधित किया जा सकता है/नेट ढांचे में काफी कुछ भी मूल्यांकन करने के लिए विस्तार किया ...

Function Evaluate(ByVal Expression As String, ByVal Args() As Object) As Object 

    If Expression.Length > 0 Then 

     'Replace each parameter in the calculation expression with the correct values 
     Dim MatchStr = "{(\d+)}" 
     Dim oMatches = Regex.Matches(Expression, MatchStr) 
     If oMatches.Count > 0 Then 
      Dim DistinctCount = (From m In oMatches _ 
           Select m.Value).Distinct.Count 
      If DistinctCount = Args.Length Then 
       For i = 0 To Args.Length - 1 
        Expression = Expression.Replace("{" & i & "}", Args(i)) 
       Next 
      Else 
       Throw New ArgumentException("Invalid number of parameters passed") 
      End If 
     End If 

     Dim FuncName As String = "Eval" & Guid.NewGuid.ToString("N") 
     Dim FuncString As String = "Imports System.Math" & vbCrLf & _ 
            "Namespace EvaluatorLibrary" & vbCrLf & _ 
            " Class Evaluators" & vbCrLf & _ 
            " Public Shared Function " & FuncName & "() As Double" & vbCrLf & _ 
            "  " & Expression & vbCrLf & _ 
            " End Function" & vbCrLf & _ 
            " End Class" & vbCrLf & _ 
            "End Namespace" 

     'Tell the compiler what language was used 
     Dim CodeProvider As CodeDomProvider = CodeDomProvider.CreateProvider("VB") 

     'Set up our compiler options... 
     Dim CompilerOptions As New CompilerParameters() 
     With CompilerOptions 
      .ReferencedAssemblies.Add("System.dll") 
      .GenerateInMemory = True 
      .TreatWarningsAsErrors = True 
     End With 

     'Compile the code that is to be evaluated 
     Dim Results As CompilerResults = _ 
      CodeProvider.CompileAssemblyFromSource(CompilerOptions, FuncString) 

     'Check there were no errors... 
     If Results.Errors.Count > 0 Then 
     Else 
      'Run the code and return the value... 
      Dim dynamicType As Type = Results.CompiledAssembly.GetType("EvaluatorLibrary.Evaluators") 
      Dim methodInfo As MethodInfo = dynamicType.GetMethod(FuncName) 
      Return methodInfo.Invoke(Nothing, Nothing) 
     End If 

    Else 
     Return 0 

    End If 

    Return 0 

End Function 

Sub Main() 
    'In a real application, this string would be loaded from a database 
    'it would be stored by some calculation administrator... 
    Dim Expr As String = " If ({0} < 20000) Then" & vbCrLf & _ 
         " Return Max(15, Min(75,0.12*{0}))" & vbCrLf & _ 
         " Else" & vbCrLf & _ 
         " Return Max(75,0.05*{0})" & vbCrLf & _ 
         " End If" 

    Dim Args As New List(Of String) 
    While True 
     'This value would be loaded from some data interpreter for inclusion 
     'in the calculation... 
     Dim Val As String = Console.ReadLine 
     Args.Clear() 
     If IsNumeric(Val) Then 
      Args.Add(Val) 
      Dim dblOut As Object = Evaluate(Expr, Args.ToArray) 
      Console.WriteLine(dblOut) 
     Else 
      Exit While 
     End If 
    End While 

End Sub 

का कोई कारण ही आप नहीं कर सका फ़ंक्शन परिभाषा को थोड़ा संशोधित करें ताकि यह आपको इसे कॉल करने की अनुमति देने के लिए स्ट्रिंग के विस्तार के रूप में कार्य कर सके:

Dim LinqString = "from c in myLinqData where c.SomeField.Equals(""somevalue"") select c" 
Dim output = LinqString.Evaluate 
संबंधित मुद्दे