使用 Linq to SQL 将 FieldExpression 转换为 LambdaExpression 时出错

Joh*_*van 5 c# lambda entity-framework linq-to-sql linqkit

Unable to cast object of type 'System.Linq.Expressions.FieldExpression' to type 'System.Linq.Expressions.LambdaExpression'运行以下代码时出现错误。

这段代码的目的是让我过滤包含某些字符串的记录(实体框架代码优先/Linq to SQL)。

注意:我正在使用第三方库 LinqKit:http : //www.albahari.com/nutshell/predicatebuilder.aspx

FilterHelper<Country> helper = new FilterHelper<Country>();
helper.AddContains(searchAlpha2, c => c.Alpha2);
helper.AddContains(searchAlpha3, c => c.Alpha3);
helper.AddContains(searchName, c => c.Name);

IQueryable<Country> countries = db.Countries.AsExpandable().Where(helper.Predicate);
Run Code Online (Sandbox Code Playgroud)

...

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; }
    }

}
Run Code Online (Sandbox Code Playgroud)

关于如何重写它以避免上述错误的任何建议?

注意:CodeReview 上的代码也是我与重构相关的原始问题。 https://codereview.stackexchange.com/questions/54888/refactor-c-linq-code-to-reduce-duplication

Gor*_*don 1

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

Expression<Func<U,T>> f = t => t.FieldName;
Run Code Online (Sandbox Code Playgroud)

然后在调试器中,查看 f(其类型为 LambdaExpression)和 LambdaExpression 的主体(Field Expression)。