4

我对 EF 实体做了一个扩展方法:

public static IEnumerable<T> WildcardSearch<T>(this IEnumerable<T> entity, 
                                                 string param, Func<T, 
                                                 string> selector)
{
    return entity.Where(l => SqlFunctions.PatIndex(param, selector(l)) > 0);
}

//exception: This function can only be invoked from LINQ to Entities.
result = context.FOO.WildcardSearch(id, x => x.Id).ToList();

如果我尝试使用它,我会得到上面的异常。

但是,如果我直接在我的集合上运行(我假设的)完全相同的代码,它会按预期工作。

为什么我会收到异常,有什么办法可以解决这个问题吗?

类似的线程建议将类型更改为IQueryable,但这似乎没有帮助。

//this works
result = context.FOO.Where(x => 
              SqlFunctions.PatIndex(id, x.Id) > 0).ToList();
4

1 回答 1

6

它需要是IQueryable<T>and Expression<Func<...>>; 不幸的是,这意味着重建表达式树 - 例如:

public static IQueryable<T> WildcardSearch<T>(this IQueryable<T> entity,
    string param, Expression<Func<T, string>> selector)
{
    var lambda = Expression.Lambda<Func<T, bool>>(
        Expression.GreaterThan(
            Expression.Call(
                typeof(SqlFunctions), "PatIndex", null,
                Expression.Constant(param, typeof(string)),
                selector.Body),
            Expression.Constant(0)),
        selector.Parameters);
    return entity.Where(lambda);
}
于 2013-06-15T11:55:15.487 回答