Genel olarak filtrelemeyi işlemek için bir uzantı yöntemi oluşturarak kodumu biraz temizlemeye çalışıyorum.Linq ile nesnelere yansıma kullanmak mümkün mü?
Temizlemeye çalıştığım kod İşte.
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);
Açıkçası çok tekrarlı. Bu yüzden yansıma kullanarak bir özellik tarafından filtrelenen bir uzantı yöntemi oluşturmaya çalıştım. İşte yöntem. "GetValue" varlığa linq tanınan olmadığını belirterek, linq çalıştırıldığında bir hata alıyorum,
var queryResult = (from r in dc.Retailers select r);
queryResult.FilterByValue("firstname", firstName);
Ama:
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
);
}
}
ve bu kadar
şöyle çağrılacak.Bunu temizlemek için başka bir yol var mı, yoksa çirkin mi bırakmak zorundayım?
Yep bunu yaptığıma. Teşekkürler. Şimdi sadece cevabınızı anlamak için birkaç kez daha tekrar okumalıyım. – Smeegs
@Smeegs Bazı gerçek değerler ile hata ayıklamaya yardımcı olabilir ve oluşturulan ifadelere (ve muhtemelen değişkenlerde saklanmadığım ara değerlerin bir kısmına) bakın. Onu görselleştirmeye yardımcı olur. İfadeler genellikle duyarlı "ToString" uygulamalarına sahiptir. – Servy
Hangi montajları/adlarını kullanıyorsunuz? SqlFunctions hem "EntityFramework.SqlServer" hem de "System.Data.Entity" içinde olduğunu görüyorum ... Bunların farklı olduğunu varsayıyorum, doğru mu? – David