0

DataTableinの列式を解析し、ADO.NETその中に含まれる依存列名のセットを識別しようとしています。

例:

ADataTableには 3 つの列Unit PriceQuantityありBreakEvenます。

列式を使用して、さらに 2 つの列を派生させることができます。

[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」をそれに含まれるソース列のセットとして取得できるようにしたいと考えています。

また、 の列式を解析するときに、 [ ] と "<code>BreakEven" をそれに含まれるソース列のセットとして取得[Profit or Loss Indication]できるようにしたいと考えています。Total Sale Value

私が見る限り、.net フレームワークには列式を解析するための独自のメカニズムがありますが、パブリック クラスとメソッドを介してその機能を公開することはありません。

4

2 に答える 2

1

超ハッキーになりたい場合は、次のようにすることができます。

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 に答える