gpt4 book ai didi

c# - IQueryable 表达式翻译

转载 作者:太空宇宙 更新时间:2023-11-03 23:43:10 25 4
gpt4 key购买 nike

我正在创建一个 IQueryable,我想将其用于传递给 Entity Framework 的查询。我的存储库不公开可查询。

 var query = new List<Entity>().AsQueryable().Where(x => x.Property == "argument");

我的存储库中有一个方法可以接收 IQueryable。

如何使用相同的可查询对象查询我的 DbSet?我正在尝试从可查询中提取表达式来为 dbset 构建一个新表达式。到目前为止,这是我所拥有的,但它不起作用:

public IDbSet<TEntity> DbSet { get; set; }

public IEnumerable<TEntity> Find(IQueryable<TEntity> queryable)
{
var parameter = Expression.Parameter(typeof (TEntity));
var body = queryable.Expression;

var lambda = Expression.Lambda<Func<TEntity, bool>>(body, parameter);
var result = DbSet.Where(lambda);
return null;
}

当我尝试创建带有以下错误的 lambda 时,代码失败:“System.Linq.IQueryable`1[MyTEntity]”类型的表达式不能用于返回类型“System.Boolean”

我显然没有正确构建表达式,我错过了什么?有没有更简单的方法来完成我想要完成的事情?

我还看到一些示例表明表达式应该具有参数属性。但无论我转换为哪种类型的表达式类型,这个是 ConstantExpression,我都没有看到 IQueryable.Expression 的参数属性。

最佳答案

在您的例子中,queryable.Expression 表示整个表达式 Queryable.Where(constantList, x => x.Property == "argument")。如果您只需要 Where() lambda,则需要提取它。为此,您可以使用如下代码:

public IEnumerable<TEntity> Find<TEntity>(IQueryable<TEntity> queryable)
{
var methodCall = queryable.Expression as MethodCallExpression;
Func<IQueryable<TEntity>, Expression<Func<TEntity,Boolean>>, IQueryable<TEntity>> whereDelegate = Queryable.Where;

if (methodCall.Method == whereDelegate.Method
&& methodCall.Arguments[0] is ConstantExpression)
{
var whereLambdaQuote = (UnaryExpression)methodCall.Arguments[1];
var whereLambda = (Expression<Func<TEntity, bool>>)whereLambdaQuote.Operand;

var result = DbSet.Where(whereLambda);
}

return null;
}

关于c# - IQueryable 表达式翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28355993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com