2012-01-07 20 views
5

चलो कहते हैं कि मैं एक वर्ग की तरह करते हैं:Linq पहुँच संपत्ति से चर

public class Foo 
{ 
    public string Title {get;set;} 
} 

अब, चलो मैं एक public List<Foo> myList जो मैं इतनी के रूप में Linq से फ़िल्टर करना चाहते है मान लें:

var x = myList.Where(f => f.Title == myValue); 

सब कुछ है अब तक अच्छा और स्पष्ट है।

लेकिन वेरिएबल द्वारा संपत्ति का उपयोग कैसे कर सकते हैं? कुछ ऐसा:

string myProperty = "Title"; 

var x = myList.Where(f => f.myProperty == myValue); 

उत्तर

12

आप एक विस्तार विधि

public static class MyExtensions 
{ 
    public static object GetProperty<T>(this T obj, string name) where T : class 
    { 
     Type t = typeof(T); 
     return t.GetProperty(name).GetValue(obj, null); 
    } 
} 

लिख सकते हैं और इस

var x = myList.Where(f => f.GetProperty("Title") == myValue); 
+0

इसे प्यार किया! धन्यवाद। – Dementic

3

यह उस स्थिति का प्रकार नहीं है जिसके लिए LINQ का उपयोग किया जाता है। LINQ संग्रहों में हेरफेर करने के लिए एक धाराप्रवाह इंटरफ़ेस है। एक पाठपरक प्रतिनिधित्व के माध्यम से सदस्यों तक पहुंच प्रतिबिंब के साथ किया जाता है।

object GetProperty(Foo f, string propertyName) { 
    var type = typeof(Foo); 
    var propInfo = type.GetProperty(propertyName); 
    return propInfo.GetValue(f, null); 
} 
0

आप नहीं कर सकते उपयोग LINQ dynamic query from microsoft यहाँ नमूना कोड

var query = db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10). 
      OrderBy("CompanyName"). 
      Select("New(CompanyName as Name, Phone)"); 
+0

आपने लाइसेंस अनुबंध से लिंक क्यों किया? –

+1

लॉल, आपको नमूना कोड डाउनलोड करने के लिए स्वीकार करने की आवश्यकता है। – Dementic

1

आप मक्खी पर गतिशील रूप से आपके प्रश्नों की रचना करने की जरूरत है, तो आप LINQ Dynamic Query पुस्तकालय, माइक्रोसॉफ्ट से एक नमूना का उपयोग कर सकते है:

यह नमूना पर LINQ कथन लिखने के लिए एक तकनीक दिखाता है, गतिशील रूप से, रन टाइम पर।

संदर्भ अपने कोड में पुस्तकालय:

using System.Linq.Dynamic; 

आपकी क्वेरी इस प्रकार दिखाई देगा:

// You can use a string as the argument for the Where method 
// meaning you can compose this string dynamically 
string myProperty = "Title"; 
var x = myList.Where(myProperty + " = " + myValue); 

यह भी कुछ हद तक क्वेरी स्ट्रिंग, जो पठनीयता में सुधार में प्लेसहोल्डर का उपयोग करने के (संभव है):

var x = myList.Where("@0 = @1", myProperty, myValue); 

एक देखें गतिशील LINQ भाग 1:: स्कॉट गुथरी से इस पोस्ट LSO Using the LINQ Dynamic Query Library (मैं वहाँ नहीं लगता कि कभी भी एक भाग 2 ... था)

नोट: यदि आप Microsoft से नमूना कोड संकलन और संदर्भ के लिए है निर्मित असेंबली, या आप अपने स्वयं के प्रोजेक्ट में कोड शामिल कर सकते हैं।

+0

हम्म, किसी भी कारण से यह मानक .NET ढांचे का हिस्सा नहीं है, आकर्षक लग रहा है .. –

+0

@ सुरजीतसम पहली LINQ रिलीज (विजुअल स्टूडियो 2008, सी # 3.0) के समय, माइक्रोसॉफ्ट ने सभी नमूनों को समझने में मदद करने के लिए बहुत सारे नमूने लिखे LINQ की शक्ति। यह उन नमूनों में से एक था, जो स्वयं ही बहुत उपयोगी हो सकता है लेकिन ढांचे का हिस्सा बनने के लिए बहुत सीमित हो सकता है। –

+0

यदि मैं इस स्थिति में रहूंगा तो स्पष्ट रूप से मैं एलबी के उत्तर को पसंद करूंगा –

1

मैं जानता हूँ कि यह एक पुरानी धागा है, लेकिन यहाँ एक और तरीका यह करने के लिए है की तरह उपयोग कर सकते हैं। यदि आपको लूप में ऐसा करने की ज़रूरत है तो इसका काफी तेज़ होने का लाभ है। मैंने इसे "func" के परिणाम को थोड़ा अधिक सामान्य उद्देश्य बनाने के लिए ऑब्जेक्ट करने के लिए परिवर्तित कर दिया है।

 var p = Expression.Parameter(typeof(string)); 
     var prop = Expression.Property(p, "Length"); 
     var con = Expression.Convert(prop, typeof(object)); 
     var exp = Expression.Lambda(con, p); 
     var func = (Func<string, object>)exp.Compile(); 

     var obj = "ABC"; 
     int len = (int)func(obj); 

मूल प्रश्न में कोड लिनक के अंदर इस्तेमाल किया जा रहा था, इसलिए गति अच्छी हो सकती है।अगर यह सही ढंग से बनाया गया था, तो सीधे "func" का उपयोग करना संभव होगा, उदाहरण के लिए

 class ABC 
     { 
      public string Name { get; set; } 
     } 

     var p = Expression.Parameter(typeof(ABC)); 
     var prop = Expression.Property(p, "Name"); 
     var body = Expression.Equal(prop, Expression.Constant("Bob")); 
     var exp = Expression.Lambda(body, p); 
     var func = (Func<ABC, bool>)exp.Compile(); 

     ABC[] items = "Fred,Bob,Mary,Jane,Bob".Split(',').Select(s => new ABC() { Name = s }).ToArray(); 
     ABC[] bobs = items.Where(func).ToArray(); 
संबंधित मुद्दे