【发布时间】:2014-01-06 16:41:41
【问题描述】:
我正在开发一个在运行时生成“where”表达式的小型库。我已经能够使用 Expression.Equal、Expression.NotEqual 甚至是字符串上的 .Contains() 方法等不同的运算符来导航对象属性和查询。
我遇到了一种情况,我需要创建一个表示链式方法的表达式,例如:x => x.SomeColumn.Trim().EndsWith("SomeText")。我不知道从哪里开始。
我已经像这样实现了.EndsWith() 方法:
static Expression<Func<TEntity, bool>> GetEndsWithExpression(
ParameterExpression parameterExpression,
Expression propertyExpression,
Expression valueToFind)
{
var propertyExp = propertyExpression;
var method = typeof(string).GetMethod("EndsWith", new[] { typeof(string) });
var someValue = valueToFind;
var containsMethodExp = Expression.Call(propertyExp, method, someValue);
return Expression.Lambda<Func<TEntity, bool>>(containsMethodExp, parameterExpression);
}
我想知道您能否帮我弄清楚如何添加.Trim() 方法并将其与.EndsWith() 方法链接起来。
其他一些信息,我已经在我的项目中使用 LINQKit,所以像 .AsExpandable() 这样的东西对我来说有点熟悉。
我最初的(错误)方法(更新)
我认为解决方案应该是这样的:
static Expression<Func<TEntity, bool>> GetTrimEndsWithExpression(
ParameterExpression parameterExpression,
Expression propertyExpression,
Expression valueToFind)
{
var propertyExp = propertyExpression;
var trimMethod = typeof(string).GetMethod("Trim");
var endsWithMethod = typeof(string).GetMethod("EndsWith", new[] { typeof(string) });
var trimMethodExpression = Expression.Call(propertyExp, trimMethod).Expand();
var containsMethodExp = Expression.Call(trimMethodExpression, endsWithMethod, valueToFind);
return Expression.Lambda<Func<TEntity, bool>>(containsMethodExp, parameterExpression);
}
但是,编译失败。它抛出一个错误:
System.Reflection.AmbiguousMatchException: Ambiguous match found.
如何在运行时生成的表达式中链接这两个方法?
【问题讨论】:
-
我的初始方法不正确。我正在编辑我的问题以显示我的实际方法和实际错误。
-
见msdn你需要指定你想要的
Trim -
我不知道 MSDN 有俄语版 :-)
标签: c# lambda expression