Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么表达式在linq中不起作用_C#_Linq_Entity Framework_Lambda - Fatal编程技术网

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

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

在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;
}
公共虚拟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);