解析lambda用于动态数据库验证规则

时间:2014-06-08 21:01:34

标签: c#-4.0 dynamic lambda

我有一种情况,我需要将一堆记录从一个数据库复制到另一个数据库,并且转移涉及大量转换。我遇到了一个案例,除了转换之外,我需要验证并拒绝源数据中的某些列值。 (例如,我处理狗和猫的重量,并且源数据中的偶然拼写错误导致过高的权重显然不正确,但从未在源数据中验证过。)无论如何,这些过高的权重不是&# 39; t允许在新数据库中,所以我必须识别并设置那些不好的值。

我想要的是将规则作为我可以在转换期间调用的字符串表达式。该规则与列映射指令一起存储。这些细节不是我的问题,而是如何将普通的字符串表达式转换为运行时表达式。

(序言:我和lambdas混淆了很多,但是我一直都被绊倒了。)这就是我拥有的......我有一个IsValid方法接受来自SqlDataReader的值。部分类ColumnRow来自DataSet,它具有下面代码中引用的ValidationRule字符串属性。

基本上,如果没有指定规则或传入值为null,则认为它有效。否则,从ValidationRule解析lambda。我需要在我的特定情况下工作的规则只是"值< 1000" - 只是为了给出一些背景信息。

partial class ColumnRow
{
    public bool IsValid(object value)
    {
        if (value == DBNull.Value) return true;
        if (IsValidationRuleNull()) return true;

        string exprString = "value => { return " + ValidationRule + "; }";
        // fails here: No property or field 'value' exists in type 'Object'
        var expr = System.Linq.Dynamic.DynamicExpression.ParseLambda<object, bool>(exprString);
        var method = expr.Compile();
        return method.Invoke(value);
    }
}

我可以在源SQL语句中添加一些硬编码标准,而不是完成所有这些操作,但是SQL方面的内容已经相当复杂,所以我宁愿不修改传入的SQL。

0 个答案:

没有答案