C# 为什么表达式在linq中不起作用
在EF上工作,需要编写一个自定义C# 为什么表达式在linq中不起作用,c#,linq,entity-framework,lambda,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<TEnt
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;
}
公共虚拟IEnumerable GetDataByID(),其中tenty:class
{
if(this.Context==null)
初始化();
TContext context=this.context;
var result=context.CreateObjectSet(),其中(GetExpression(5));
返回结果;
}
公共表达式GetExpression(int-id),其中tenty:class
{
ParameterExpression e=表达式参数(typeof(tenty),“e”);
PropertyInfo-propInfo=typeof(tenty).GetProperty(EntityInfo.GetPkFieldName(this.Context));/(KeyPropertyName);
MemberExpression m=Expression.MakeMemberAccess(e,propInfo);
ConstantExpression c=表达式常数(id,typeof(int));
BinaryExpression b=表达式.Equal(m,c);
表达式lambda=表达式lambda(b,e);
返回lambda;
}
错误:
匹配的最佳重载方法
'System.Data.Objects.ObjectQuery.Where(字符串,参数
System.Data.Objects.ObjectParameter[])具有一些无效参数
为什么我的上述语法不起作用,如何修复它
匹配的最佳重载方法
'System.Data.Objects.ObjectQuery.Where(字符串,参数
System.Data.Objects.ObjectParameter[])具有一些无效参数
问题在于这一行:
var result = context.CreateObjectSet<TEntity>().Where(GetExpression<TEntity>(5));
var result=context.CreateObjectSet().Where(GetExpression(5));
事实上,您指定了错误的参数:
public ObjectQuery在哪里(
字符串谓词,
params ObjectParameter[]参数
)
实际上,您应该传递一个字符串。问题是,
CreateObjectSet
的结果返回一个ObjectSet
,它定义了编译器将尝试使用的自己的方法。您提供的参数对此方法无效,因此出现错误
您想要使用的是Linq的扩展方法,如下所示:
var predicate = GetExpression<TEntity>(5);
var objectSet = context.CreateObjectSet<TEntity>();
var results = System.Linq.Queryable.Where(objectSet, predicate);
var谓词=GetExpression(5);
var objectSet=context.CreateObjectSet();
var results=System.Linq.Queryable.Where(objectSet,谓词);
错误消息是什么?在编辑之前,我单击了downvote,将实体与表达式进行比较。因此,似乎已将否决票登记为在编辑后发生(小故障?),因此我目前无法删除它。如果你做一个小的编辑,我将删除否决票,因为我现在发现答案没有错:)
var predicate = GetExpression<TEntity>(5);
var objectSet = context.CreateObjectSet<TEntity>();
var results = System.Linq.Queryable.Where(objectSet, predicate);