У меня есть следующий код:
var dbContacts = dbContacts.Where(k => k.Name != null && k.Name.ToLower().IndexOf(model.name.ToLower()) > -1);
что, безусловно, слишком длинно, я пытаюсь добиться следующего, не повторяя эту функцию для нескольких свойств:
var dbContacts = dbContacts.Where(k => contains(k.Name,model.name));
// or
var dbContacts = dbContacts.Where(k => k.Name.ContainsIgnoreCase(model.name));
Я проверил эту тему, все ответы используют Expression
, где он повторно использует все выражение вместо конкретной функции в этом выражении для определенного свойства.
Однако то, что я пробовал до сих пор (и получить выражение LINQ, не удалось перевести):
// defining a delegate Func
Func<string, string, bool> contains = (string str, string value) =>
{
return str != null && str.ToLower().IndexOf(value.ToLower()) > -1;
};
// using an extension
public static bool ContainsIgnoreCase(this string str, string value)
{
return str.IndexOf(value, StringComparison.OrdinalIgnoreCase) > -1;
}
Я хотел бы повторно использовать эту функцию для определенного свойства в любом выражении LINQ to SQL.
Любые идеи?
ToLower
(которые убивают производительность), потому что используется сопоставление базы данных, которое в большинстве случаев нечувствительно к регистру. Остается короткий предикат, обобщение которого, возможно, не стоит усилий. Если вы все еще хотите этого, в сети есть много примеров, как это сделать. - person Gert Arnold   schedule 27.04.2020Func<T, bool>
наExpression<Func<T,bool>>
. - person Jeremy Lakeman   schedule 27.04.2020Expression
будет означать повторное использование всего выражения вместо конкретной функции в этом выражении для определенного свойства. - person Ali Kleit   schedule 27.04.2020Func<T,bool>
, которого не распознает. Вашаcontains
лямбда не может быть преобразована в sql. - person Jeremy Lakeman   schedule 27.04.2020