为什么表达式在 linq 中不起作用

本文关键字:不起作用 linq 表达式 为什么 | 更新日期: 2023-09-27 17:49:20

在EF上工作,需要编写一个自定义

public virtual IEnumerable GetDataByID<TEntity>() where TEntity : class
{
    if (this.Context == null)
        Initialize<TEntity>();
    TContext context = this.Context;
    var result = context.CreateObjectSet<TEntity>().Where(GetExpression<TEntity>(5));
    return result;
}
public Expression GetExpression<TEntity>(int id) where TEntity : class
{
    ParameterExpression e = Expression.Parameter(typeof(TEntity), "e");
    PropertyInfo propInfo = typeof(TEntity).GetProperty(EntityInfo<TEntity>.GetPkFieldName(this.Context));//(KeyPropertyName);
    MemberExpression m = Expression.MakeMemberAccess(e, propInfo);
    ConstantExpression c = Expression.Constant(id, typeof(int));
    BinaryExpression b = Expression.Equal(m, c);
    Expression<Func<TEntity, bool>> lambda = Expression.Lambda<Func<TEntity, bool>>(b, e);
    return lambda;
}

错误:

最佳重载方法匹配 'System.Data.Objects.ObjectQuery.Where(string, params System.Data.Objects.ObjectParameter[](' 有一些无效的参数

为什么我的上述语法不起作用,如何解决?

为什么表达式在 linq 中不起作用

问题是,CreateObjectSet<TEntity>的结果返回一个ObjectSet<TEntity>,该定义了编译器将尝试使用自己的Where方法。您提供的参数对此方法无效,因此会出现错误。

你想使用的是Linq的Queryable.Where扩展方法,如下所示:

var predicate = GetExpression<TEntity>(5);
var objectSet = context.CreateObjectSet<TEntity>();
var results = System.Linq.Queryable.Where(objectSet, predicate);

最佳重载方法匹配 'System.Data.Objects.ObjectQuery.Where(string, params System.Data.Objects.ObjectParameter[](' 有一些无效的参数

问题是这一行:

var result = context.CreateObjectSet<TEntity>().Where(GetExpression<TEntity>(5));

事实上,您指定了错误的参数:ObjectQuery<T>.Where

public ObjectQuery<T> Where(
    string predicate,
    params ObjectParameter[] parameters
)

事实上,你应该传递一个字符串。