0

我正在尝试解析DataTablein的列表达式ADO.NET并识别其中包含的一组依赖列名。

例子:

ADataTable有 3 列Unit PriceQuantityBreakEven

我们可以通过列表达式导出两个额外的列。

[Total Sale Value] = “IIF([Unit Price] > 0, [Unit Price] * Quantity, 0)”
[Profit or Loss Indication] = “IIF([Total Sale Value]> BreakEven, ‘Profit’, ‘Loss’)”

当我手动解析 [Total Sale Value] 的列表达式时,我希望能够选择 [Unit Price] 和“Quantity”作为其中包含的一组源列。

此外,当我解析 的列表达式时[Profit or Loss Indication],我希望能够选择 [ Total Sale Value] 和 “<code>BreakEven” 作为其中包含的一组源列。

据我所知,尽管 .net 框架有自己的解析列表达式的机制,但它并没有通过公共类和方法公开任何功能。

4

2 回答 2

1

如果你想成为超级 hacky,你可以这样做:

public static class DataColumnExtensions
{
    private static readonly Assembly DataAssembly = Assembly.GetAssembly(typeof(DataTable));

    public static bool DependsOn(this DataColumn thisColumn, DataColumn otherColumn)
    {
        if (string.IsNullOrEmpty(thisColumn.Expression))
        {
            return false;
        }

        var dataExpression = DataAssembly.CreateInstance(
            "System.Data.DataExpression",
            false,
            BindingFlags.Default | BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.NonPublic,
            null,
            new object[] { thisColumn.Table, thisColumn.Expression, thisColumn.DataType },
            null,
            null);

        var dependsOnMethod = dataExpression.GetType().GetMethod("DependsOn", BindingFlags.NonPublic | BindingFlags.Instance);

        var result = (bool)dependsOnMethod.Invoke(dataExpression, new object[] { otherColumn });

        return result;
    }
}
于 2012-08-01T15:47:18.630 回答
0

这很复杂——我认为唯一可靠的方法是复制.NET Framework 代码,即内部System.Data.DataExpression 类,然后是ExpressionNode 等相关类。

于 2012-05-25T08:43:39.627 回答