作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试编写常用的 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.GreaterThan
在Expression<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/
我是一名优秀的程序员,十分优秀!