Ваше выражение слишком сложно интерпретировать с помощью LINQ to SQL-конвертера, поэтому оно компилируется и выполняется на каждом элементе вашей таблицы, поэтому неудивительно, что он выполняется чрезвычайно медленно.
Вам необходимо построить дерево выражений на основе свойств, которые вы хотите найти, а затем построить Expression<Func<MyType, bool>>
, чтобы перейти к вашему методу Where(...)
. Таким образом, LINQ to SQL converter распознает это.
Попробуйте это:
ParameterExpression param = Expression.Parameter(typeof(MyType));
MethodInfo stringStartsWith = typeof(string).GetMethods().First(m => m.Name == "StartsWith" && m.GetParameters().Length == 1);
PropertyInfo firstProp = typeof(MyType).GetProperty(vm.SearchProperties.First());
MemberExpression firstMembAccess = Expression.Property(param, firstProp);
MethodCallExpression firstStartsWithExpr = Expression.Call(firstMembAccess, stringStartsWith, Expression.Constant(mySearchString));
Expression current = firstStartsWithExpr;
foreach (string s in vm.SearchProperties.Skip(1))
{
PropertyInfo prop = typeof(MyType).GetProperty(s);
MemberExpression membAccess = Expression.Property(param, prop);
MethodCallExpression startsWithExpr = Expression.Call(membAccess, stringStartsWith, Expression.Constant(mySearchString));
current = Expression.OrElse(current, startsWithExpr);
}
Expression<Func<MyType, bool>> mySearchExpression = Expression.Lambda<Func<MyType, bool>>(current, param);
result = db.MyTable.Where(mySearchExpression);
Примечание: MyType
относится к тому, что ваш тип объекта является.
вы имели в виду сказать "_перед_ я добавил отражение часть"? – JLRishe
какая часть медленная, если или линия? –
Ваше выражение должно быть сложным для интерпретации конвертером LINQ to SQL, поэтому оно компилируется и выполняется на каждом элементе в вашей таблице. Я бы построил дерево выражений на основе свойств, которые вы хотите искать, а затем передайте их как 'Expression>'. –