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

时间:2012-12-24 11:39:01

标签: c# linq entity-framework lambda

在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 [])'有一些无效的参数

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

2 个答案:

答案 0 :(得分:1)

  

最佳重载方法匹配   '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
)

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

答案 1 :(得分:1)

问题是,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);