在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 [])'有一些无效的参数
为什么我的上述语法不起作用,如何解决?
答案 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);