C# 使用Linq to SQL将FieldExpression强制转换为LambdaExpression时出错

C# 使用Linq to SQL将FieldExpression强制转换为LambdaExpression时出错,c#,entity-framework,linq-to-sql,lambda,linqkit,C#,Entity Framework,Linq To Sql,Lambda,Linqkit,运行以下代码时,我遇到错误无法将“System.Linq.Expressions.FieldExpression”类型的对象强制转换为“System.Linq.Expressions.LambdaExpression” 这段代码的目的是允许我过滤包含特定字符串的记录(实体框架代码优先/Linq到SQL) 注意:我正在使用第三方库LinqKit: FilterHelper helper=新的FilterHelper(); AddContains(searchAlpha2,c=>c.Alpha2);

运行以下代码时,我遇到错误
无法将“System.Linq.Expressions.FieldExpression”类型的对象强制转换为“System.Linq.Expressions.LambdaExpression”

这段代码的目的是允许我过滤包含特定字符串的记录(实体框架代码优先/Linq到SQL)

注意:我正在使用第三方库LinqKit:

FilterHelper helper=新的FilterHelper();
AddContains(searchAlpha2,c=>c.Alpha2);
AddContains(searchAlpha3,c=>c.Alpha3);
AddContains(searchName,c=>c.Name);
IQueryable countries=db.countries.AsExpandable().Where(helper.Predicate);

公共类过滤器帮助器
{
公共委托字符串GetColumn(T项);
私有表达式谓词;
公共过滤器帮助器()
{
this.predicate=PredicateBuilder.True();
}
public void AddContains(字符串searchText,GetColumn GetColumn)
{
如果(!string.IsNullOrWhiteSpace(searchText))
谓词=谓词。和(c=>getColumn(c)!=null?getColumn(c)。包含(searchText):false);
}  
公共表达式谓词
{
获取{返回this.predicate;}
}
}
有没有关于我如何重写这篇文章以避免上述错误的建议


注意:CodeReview上的代码也是我最初提出的与重构相关的问题

字段表达式不是LambdaExpression。可以将其作为表达式的主体。在调试器中,您可以尝试以下操作来探索LambdaExpression的结构:

Expression<Func<U,T>> f = t => t.FieldName;
表达式f=t=>t.FieldName;

然后在调试器中,查看f,它是LambdaExpression类型,以及LambdaExpression的主体,它是字段表达式。

您是使用链接到的站点的DLL,还是使用NuGet的DLL?我认为这是已经解决的问题,所以如果你还没有解决的话,试试NuGet版本;我使用的是网站上的那个;现在替换为NuGet版本…遗憾的是,仍然得到相同的错误(NuGet/相关页面的v1.1.1:)相同的错误,不同的原因。我怀疑它与getColumn参数有关,它似乎应该类似于
Expression
,这样谓词就可以使用属性,而不是值,但我刚刚开始学习表达式,在这方面没有什么帮助。我想我明白了!看起来我需要使用Invoke。因此,如果
getColumn
的类型是
Expression
,那么
predicate=predicate.And(c=>getColumn.Invoke(c)!=null?…)
public class FilterHelper<T>
{
    public delegate string GetColumn<T>(T item);

    private Expression<Func<T,bool>> predicate; 

    public FilterHelper()
    {
        this.predicate = PredicateBuilder.True<T>();
    }
    public void AddContains(string searchText, GetColumn<T> getColumn)
    {
        if (!string.IsNullOrWhiteSpace(searchText))
            predicate = predicate.And(c => getColumn(c) != null ? getColumn(c).Contains(searchText) : false);
    }  
    public Expression<Func<T,bool>> Predicate
    {
        get { return this.predicate; }
    }

}
Expression<Func<U,T>> f = t => t.FieldName;