Я пытаюсь создать выражение, которое использует FirstOrDefault с предикатом в выражении IEnumerable<TComparable>
, но оно дает мне эту ошибку: Параметр 'o' не был связан в указано LINQ для выражения Сущности запросаНе удается преобразовать этот linq в дерево динамических выражений
у меня есть выражение Linq, как это:
IEnumerable<string> names = new List<string>() { "abc", "def", "ghi" };
string name = names.FirstOrDefault(o => o.Contains("abc"));
public static Expression FirstOrDefault(this Expression expression, Type collectionValuesType, MethodInfo comparerMethod, string keyword)
{
MethodInfo firstOrDefaultMethod = typeof(Enumerable).GetMethods()
.FirstOrDefault(o => o.Name == "FirstOrDefault" && o.GetParameters().Length == 2)
.MakeGenericMethod(new Type[] { collectionValuesType });
Type firstOrDefaultDelegateType = typeof(Func<,>).MakeGenericType(collectionValuesType, typeof(bool));
ParameterExpression firstOrDefaultPredicateParameter = Expression.Parameter(collectionValuesType);
//THIS LINE binds the "o" in (o => o.Contains("abc")) , and it is where I'm stuck with since yesterday!
MemberExpression firstOrDefaultParameterO = Expression.Property(expression, typeof(string).GetProperty(???));
//o => o.ComparerMethod(keyword)
MethodCallExpression firstOrDefaultCompareExpression = Expression.Call(
firstOrDefaultParameterO,
comparerMethod,
Expression.Constant(keyword, typeof(string))
);
//expression.FirstOrDefault(firstOrDefaultCompareExpression);
return Expression.Call(
firstOrDefaultMethod,
expression,
Expression.Lambda(firstOrDefaultDelegateType, firstOrDefaultCompareExpression, Expression.Parameter(collectionValuesType))
);
}
Если бы я был сложный тип, я бы с помощью так:
public class Example { public string Name; }
//o => o.Name.Contains("abc"))
MemberExpression firstOrDefaultParameterO = Expression.Property(expression, typeof(Example).GetProperty("Name"));
Проблема в том, что я не знаю, как связать тип строки, поскольку у нее нет свойства, которое даст значение свойства.
КСТАТИ: collectionValuesType = TypeOf (строка)
Я редактировал вопрос, как предложено, чтобы сделать вещи ясно.
ли вы имеете в виду, как назвать новую функцию? или как использовать параметр «o» внутри вашей функции? – ANewGuyInTown
Как использовать параметр «o» внутри функции, как это происходит, я получаю эту ошибку: параметр «o» не был связан в указанном выражении запроса LINQ to Entities Я добавил имя «o» в firstOrDefaultPredicateParameter для отладки –
Вы имеете в виду что-то вроде этого? 'ParameterExpression parameterExpression = System.Linq.Expressions.Expression.Parameter (collectionValuesType," x ");'. – ANewGuyInTown