C# 4.0 解析lambdas以获取动态数据库验证规则

C# 4.0 解析lambdas以获取动态数据库验证规则,c#-4.0,dynamic,lambda,C# 4.0,Dynamic,Lambda,我的情况是,我需要将一组记录从一个数据库复制到另一个数据库,并且传输涉及大量转换。我遇到了一种情况,除了转换之外,我还需要验证和拒绝源数据中的某些列值。例如,我处理的是狗和猫的体重,源数据中偶尔的输入错误导致了明显不正确的过高体重,但从未在源数据中验证过。无论如何,这些过高的权重在新的数据库中是不允许的,所以我必须识别并将那些不好的值放在一边 我想要的是将规则作为字符串表达式,以便在转换过程中调用。该规则与列映射指令一起存储。这方面的细节不是我的问题,而是如何将普通字符串表达式转换为运行时表达式

我的情况是,我需要将一组记录从一个数据库复制到另一个数据库,并且传输涉及大量转换。我遇到了一种情况,除了转换之外,我还需要验证和拒绝源数据中的某些列值。例如,我处理的是狗和猫的体重,源数据中偶尔的输入错误导致了明显不正确的过高体重,但从未在源数据中验证过。无论如何,这些过高的权重在新的数据库中是不允许的,所以我必须识别并将那些不好的值放在一边

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

前言:我和兰博达斯混得很熟,但我总是被绊倒。这是我的。。。。我有一个IsValid方法,它接受来自SqlDataReader的值。分部类ColumnRow来自一个数据集,它具有下面代码中引用的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。

我知道这不是对您问题的直接回答,但您可以使用SSIS包和ETL。完美的用例。我知道SSIS就是用于此目的的,但我从未想过它适合处理最终在目标数据库中更改的外键。我对SSI的总体感觉是,它不能很好地扩展到复杂场景。我的是一个多租户系统,我将客户一次转移到一个新的数据库,这意味着目标数据库中的密钥都不同,不能使用identity insert。因此,一组外键会受到影响,必须重新映射到新的主键。所以,我有一个专门的应用程序来处理这类事情。。。。