Próbuję trochę uprzątnąć mój kod, tworząc metodę rozszerzenia, aby ogólnie obsługiwać filtrowanie.Czy można użyć odbicia z linq do encji?
Oto kod, który próbuję wyczyścić.
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);
Jest wyraźnie powtarzalny. Próbowałem więc stworzyć metodę rozszerzenia, która była filtrowana przez właściwość za pomocą odbicia. Oto metoda.
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
);
}
}
i to się nazywać tak:
var queryResult = (from r in dc.Retailers select r);
queryResult.FilterByValue("firstname", firstName);
Ale pojawia się błąd, gdy wykonuje LINQ, stwierdzając, że "GetValue" nie jest rozpoznawana w LINQ do jednostki.
Czy jest jakiś inny sposób, aby to posprzątać, czy muszę go brzydko zostawić?
Tak, że to zrobił. Dzięki. Teraz muszę jeszcze raz przeczytać twoją odpowiedź jeszcze kilka razy, aby to zrozumieć. – Smeegs
@Smeegs Może pomóc w debugowaniu z pewnymi rzeczywistymi wartościami i przyjrzeć się utworzonym wyrażeniom (a nawet niektórym pośrednim wartościom, które nie przechowuję w zmiennych). Pomaga to go zwizualizować. Wyrażenia generalnie mają sensowne implementacje "ToString". – Servy
Z jakich złożeń/obszarów nazw używasz? Widzę SqlFunctions jest zarówno w 'EntityFramework.SqlServer' i' System.Data.Entity' ... Zakładam, że są różne, prawda? – David