2

在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[])' 的最佳重载方法匹配有一些无效参数

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

4

2 回答 2

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);
于 2012-12-24T12:00:03.130 回答
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
)

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

于 2012-12-24T11:56:19.320 回答