首页 > 解决方案 > 为 EfCore IQueryable.Where 构建谓词

问题描述

我想Search<T>为 IQueryable 做一个扩展方法,但是得到一个无法翻译的 LINQ 表达式运行时错误。

public static IQueryable<T> Search<T>(this IQueryable<T> source, Func<T, string> expression, string search)
{
    if (source == null)
        throw new ArgumentNullException(nameof(source));

    if (string.IsNullOrWhiteSpace(search))
        return source;

    return source.Where(x => EF.Functions.Like(expression(x), $"%{search}%"));
}

用法:

dbContext.People.Search(x => x.Name, "Joe").ToList();

我猜错误的行是expression(x),但正确的方法是什么?

标签: c#.netef-core-3.1

解决方案


它不使用 Like 功能,但作为扩展可以正常工作。

var result = dbContex.Currencies.Search(x=>x.Symbol, "EUR").ToList();


public static IQueryable<T> Search<T>(this IQueryable<T> source,  Expression<Func<T,string>> expression, string search)
        {
            if (source == null)
                throw new ArgumentNullException(nameof(source));

            if (string.IsNullOrWhiteSpace(search))
                return source;
            var method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
            var value = Expression.Constant(search, typeof(string));
            var exp1 = Expression.Call(expression.Body, method, value);
            var ex2 = Expression.Lambda<Func<T, bool>>(exp1, expression.Parameters[0]);
            

            return source.Where(ex2);
        }

推荐阅读