2011-10-21 10 views
9

मैं कुछ इस तरह प्राप्त करने के लिए जिस तरह से तलाश कर रहा हूँ:इकाई की रूपरेखा स्ट्रिंग चर के रूप में स्तंभ नाम उपलब्ध कराने के

string _col1 = "first name"; 
string _name; 
var query = from c in ctx.Customers select c; 
_name = query.FirstOrDefault().[_name]; 

जहां तक ​​मैं देख सकता हूँ मैं केवल दृढ़ता से फ़ील्ड नाम टाइप किया प्राप्त कर सकते हैं, लेकिन मैं प्रदान करना चाहते हैं उन्हें स्ट्रिंग चर के रूप में।

+1

आप स्तंभ या उस स्तंभ के आधार पर फ़िल्टर का चयन मतलब? आपके उदाहरण में आप इसे निर्दिष्ट करने के बाद _col1 का उपयोग नहीं कर रहे हैं। कृपया निर्दिष्ट करें ... – AJC

+0

मुझे तारों की सूची से स्ट्रिंग मान के आधार पर कॉलम नाम रखना होगा, इसलिए यह फ़िल्टर करने के लिए नहीं है – Andy

उत्तर

19

मुझे यकीन नहीं है कि क्या ईएफ आपको संपत्ति के स्ट्रिंग नाम के आधार पर संपत्ति मूल्य प्राप्त करने का एक तरीका प्रदान करता है, लेकिन आप प्रतिबिंब का उपयोग कर सकते हैं।

string name = typeof(Customer) 
    .GetProperty("first name") 
    .GetValue(query.First(), null) as string; 

मैं एफई वर्ग आप के साथ Customer कहा जाता है काम कर रहे अनुमान लगा रहा हूँ।

+1

सही काम करता है, आप सभी को धन्यवाद! – Andy

+0

खुशी है कि यह काम कर रहा है। उत्तर को सही उत्तर के रूप में चिह्नित करें। धन्यवाद। –

+0

त्रुटि केवल एक के बजाय वस्तुओं का संग्रह प्राप्त करते समय। – Matt

4

आपको इसके लिए प्रतिबिंब का उपयोग करने की आवश्यकता है। यदि आप एक dynamicly चयनित स्तंभ के आधार पर फ़िल्टर करने की कोशिश कर रहे हैं, तो आप कुछ इस तरह की कोशिश कर सकते हैं:

string propertyName 
string keyword 

ParameterExpression parameter = Expression.Parameter(typeof(YourType), "x"); 
Expression property = Expression.Property(parameter, propertyName); 
Expression target = Expression.Constant(keyword); 
Expression containsMethod = Expression.Call(property, "Contains", null, target); 
Expression<Func<YourType, bool>> lambda = 
    Expression.Lambda<Func<YourType, bool>>(containsMethod, parameter); 

var companies = repository.AsQueryable().Where(lambda); 

मैं क्या आप तो आप लांबा पैदा करने के लिए एक ही सिद्धांत का उपयोग कर सकते हैं, ऐसा करने के लिए एक विशेष कॉलम को चुन रही है कोशिश कर रहे हैं अभिव्यक्ति और चयन में इसका उपयोग करें (कम से कम स्थिति)

var companies = repository.AsQueryable().Where(whatever).Select(lambda); 
+0

इसके लिए कुछ संदर्भ है? "एक्स" का क्या अर्थ है? – Matt

+0

@ मैट "एक्स" लैम्ब्डा अभिव्यक्ति के लिए है, जैसा कि 'x => x.Property' में कुछ भी हो सकता है। संदर्भ, मुझे एक प्रश्न से मिला, मैंने पूछा, http://stackoverflow.com/questions/7246715/use-reflection-to-get-lambda-expression-from-property-name। – AJC

0

किसी भी कारण से यह मेरे लिए काम नहीं करेगा।

मेरे समान काम के समाधान है कि:

string name = null; 

// Select the PropertyInfo of the column. 
PropertyInfo propertyInfo = query.First().GetType().GetProperty("first name"); 

if (propertyInfo != null) 
{ 
    try 
    { 
    // Select the content of the column. 
    name = pi.GetValue(query.First(), null).ToString(); 
    } 
    catch (Exception) 
    { 
    // Continue with null-string. 
    } 

}

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