मैं सामान्य रूप से फ़िल्टरिंग को संभालने के लिए एक एक्सटेंशन विधि बनाकर थोड़ा सा कोड साफ़ करने की कोशिश कर रहा हूं।क्या इकाई से linq के साथ प्रतिबिंब का उपयोग करना संभव है?
यहां वह कोड है जिसे मैं साफ़ करने की कोशिश कर रहा हूं।
var queryResult = (from r in dc.Retailers select r);
if (!string.IsNullOrEmpty(firstName))
queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(firstName.Trim(), ex.FirstName.Trim()) > 0);
if (!string.IsNullOrEmpty(lastName))
queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(lastName.Trim(), ex.LastName.Trim()) > 0);
if (!string.IsNullOrEmpty(companyName))
queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(companyName.Trim(), ex.CompanyName.Trim()) > 0);
if (!string.IsNullOrEmpty(phone))
queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(phone.Trim(), ex.Phone.Trim()) > 0);
if (!string.IsNullOrEmpty(email))
queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(email.Trim(), ex.Email.Trim()) > 0);
if (!string.IsNullOrEmpty(city))
queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(city.Trim(), ex.City.Trim()) > 0);
if (!string.IsNullOrEmpty(zip))
queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(zip.Trim(), ex.Zip.Trim()) > 0);
if (!string.IsNullOrEmpty(country))
queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(country.Trim(), ex.Country.Trim()) > 0);
if (!string.IsNullOrEmpty(state))
queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(state.Trim(), ex.State.Trim()) > 0);
यह स्पष्ट रूप से बहुत ही दोहरावदार है। तो मैंने एक विस्तार विधि बनाने की कोशिश की जो प्रतिबिंब का उपयोग कर संपत्ति द्वारा फ़िल्टर किया गया। विधि यहाँ है।
public static void FilterByValue<T>(this IQueryable<T> obj, string propertyName, string propertyValue)
{
if (!string.IsNullOrEmpty(propertyValue))
{
obj =
obj.Where(
ex =>
SqlFunctions.PatIndex(propertyValue.Trim(), (string)typeof(T).GetProperty(propertyName,
BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase).GetValue(ex)) > 0
);
}
}
और यह है, इसलिए की तरह कहा जाता है के लिए किया जा:
var queryResult = (from r in dc.Retailers select r);
queryResult.FilterByValue("firstname", firstName);
लेकिन, जब LINQ कार्यान्वित मैं कोई त्रुटि मिलती है, उन्होंने कहा कि "getValue" संस्था के लिए LINQ में मान्यता प्राप्त नहीं है।
तो, क्या इसे साफ़ करने का कोई और तरीका है, या क्या मुझे इसे बदसूरत छोड़ना है?
हां, यही किया था। धन्यवाद। अब मुझे इसे समझने के लिए बस कुछ और बार जवाब देना होगा। – Smeegs
@ सेमेग्स यह कुछ वास्तविक मूल्यों के साथ इसे डीबग करने में मदद कर सकता है और बनाए गए अभिव्यक्तियों पर एक नज़र डालने में मदद कर सकता है (और संभावित रूप से कुछ इंटरमीडिएट वैल्यू जो मैं चर में स्टोर नहीं करता)। यह इसे देखने में मदद करता है। अभिव्यक्तियों में आमतौर पर समझदार 'ToString' कार्यान्वयन होते हैं। – Servy
आप कौन सी असेंबली/नामस्थान का उपयोग कर रहे हैं? मैं देखता हूं कि SQLFunctions 'EntityFramework.SqlServer' और' System.Data.Entity' दोनों में है ... मुझे लगता है कि ये अलग हैं, है ना? – David