gpt4 book ai didi

c# - 如何在 C# 中从另一个表达式创建一个表达式?

转载 作者:太空狗 更新时间:2023-10-30 01:35:19 25 4
gpt4 key购买 nike

我正在尝试编写常用的 Linq to SQL 查询等,我发现我必须使用表达式而不是 lambda。

如果您不这样做,它会尝试将您的 Linq 直接转换为 SQL,但它不起作用。

以表上的主键为例。我们的名字都不同,但我想编写一个标准的 Linq WHERE 子句,它使用表达式来选择正确的字段。

我写了如下测试代码:

    static void Main(string[] args)
{
using (var ss = new DataScope()
{
var db = DataScope.DatabaseConnection;
var pk = 2;
var sql = db.Beats.AsQueryable();
sql = sql.Where(Filter(pk));
var res = sql.ToList();
}
}

static Expression<Func<Beat, bool>> Filter(int pk)
{
return e => e.BeatID > pk;
}

代码是主要工作,Filter(int) 按 PKID 过滤,我可以将其转换为通用代码,更多派生属性在每个表的基础上返回表达式。

但这有点受限,我只想定义指向 PK 字段的表达式并从中构建更多的股票表达式。

否则,如果我想要 PKGreaterThan 和 PKEquals,我必须为每个表定义两次。我需要大约一打,而且有数百张 table 。

让每个表都定义指向关键字段(PK、GUID、唯一字符串、创建日期时间等)的表达式会更整洁

但是我不知道怎么办。

到目前为止,我想出的最好的(但它丝毫不起作用)是:

    static Expression<Func<Beat, int>> PKExpression
{
get { return e => e.BeatID; }
}

static Expression<Func<Beat, bool>> SuperFilter(int pk)
{
var gt = Expression.GreaterThan(PKExpression, Expression.Constant(pk));
return e => gt;
}

我如何包装 Expression.GreaterThanExpression<Func<Beat, int>>

最佳答案

我认为您必须通过 Expression.Lambda<Func<Beat, bool>> 将其转换为 Lambda 表达式

ParameterExpression param = Expression.Parameter(typeof(Beat));
var gt = Expression.GreaterThan(Expression.Call(PKExpression,param), Expression.Constant(pk));
LambdaExpression condition =Expression.Lambda<Func<Beat, bool>>(gt, param);
return condition;

关于c# - 如何在 C# 中从另一个表达式创建一个表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26296340/

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