2013-03-29 6 views
5

मैं इस तरह एक वर्ग है:Linq खोज विभिन्न द्वारा महत्व देता

class Person 
{ 
    private String sName; 
    private String sPhone; 
    private String sAge; 
    private String sE_Mail; 
    // … code … 
} 

और मैं उपयोगकर्ता से प्राप्त मूल्य से एक खोज, यह हो सकता है, इस वर्ग के किसी भी विशेषता बनाने के लिए किया है। मेरे पास यह भी है:

public IEnumerable<Person> SearchByPhone(string value) 
{ 
    return from person in personCollection     
      where person.**SPhone** == value 
      select person; 
} 

मेरे पास इस तरह के चार तरीके हैं, केवल अंतर ही विशेषता है। कृपया, क्या कोई मुझे बता सकता है कि मैं इसे केवल एक विधि में कैसे कर सकता हूं या संभव नहीं है? धन्यवाद।

उत्तर

5

अलग-अलग तरीकों को लिखने की आवश्यकता नहीं है। एक एकल विधि पर्याप्त होगा:

Search("SOME VALUE", input=>input.sPhone); //sPhone must be public 
Search("SOME VALUE", input=>input.sAge);  //sAge must be public 
+2

आप भी करने के लिए वहाँ स्ट्रिंग के लिए स्विच कर सकता है टी, और इसे सामान्य बनाएं और कुछ भी –

+0

के लिए काम करें यह linq-to-sql के लिए काम नहीं करेगा। 'एक्सप्रेस >', और शरीर को 'कहीं भी' करने के लिए हस्ताक्षर बदलने के लिए हस्ताक्षर बदलें। दुर्भाग्य से –

+0

@ होसेनिन नारिमानीराड, जो अभी भी लिंक-टू-एसक्यूएल/इकाइयों में काम नहीं करेगा। –

3

आप इस

public IQueryable<Person> Search(string column, string value) 
{ 
    return personCollection.Where(string.Format("{0} = @1", column), value); 
} 

के लिए dynamic linq library उपयोग कर सकते हैं या आप अपने आप को भाव बना सकते हैं::

public IEnumerable<Person> Search<T>(T value, Func<Person,T> mapFunc) 
{ 
    return from person in personCollection     
      where mapFunc(person).Equals(value) 
      select person; 
} 

तो यह इस तरह से फोन

public IQueryable<Person> Search(string column, string value) 
{ 
    var param = Expression.Parameter(typeof(T), "x"); 
    var prop = Expression.Property(param, column); 
    var val = Expression.Constant(value, prop.Type); 
    var equals = Expression.Equal(prop, val); 
    var lambda = Expression.Lambda(equals, param); 
    return personCollection.Where(lambda); 
} 
+0

+1 अच्छा। मुझे यह नहीं पता था। –

1

जहां कथन को एक या ऑपरेशन में बनाना सबसे आसान तरीका होगा।

public IEnumerable<Person> SearchByValue(string value) 
{ 
    return from person in personCollection 
      where (person.sName.Equals(value) || 
       person.sPhone.Equals(value) || person.sAge.Equals(value) || 
       person.sE_Mail.Equals(value)); 
} 

व्यक्तिगत रूप से मैं धाराप्रवाह एपीआई का उपयोग कर के रूप में यह कम वर्बोज़ है पसंद करते हैं और बनाता है चेनिंग LINQ एक साथ आदेशों को थोड़ा और स्पष्ट ... कि कार्यान्वयन यहाँ है और साथ ही

public IEnumerable<Person> SearchByValue(string value) 
{ 
    return personCollection.Where(p => p.sName.Equals(value) || 
       p.sPhone.Equals(value) || p.sAge.Equals(value) || 
       p.sE_Mail.Equals(value)); 
} 
संबंधित मुद्दे