SQLステートメントを解析したいとします
SELECT foo, bar, baz FROM myTable WHERE baz = 2 ORDER BY baz ASC, bar DESC
また、順序付けに使用する列と方向をプログラムで決定します。いくつかのグーグル検索の後、ここに私が思いついたものがあります:
List<ParseError> Errors;
TSql100Parser parser = new TSql100Parser(true);
TSqlFragment result = parser.Parse(
new StringReader("SELECT foo, bar, baz FROM myTable WHERE baz = 2 ORDER BY baz ASC, bar DESC"),
out Errors);
foreach (var ts in (result as TSqlScript).Batches)
{
foreach (var st in ts.Statements)
{
SelectStatement selectStatement = (SelectStatement) st;
IList<ExpressionWithSortOrder> _list = selectStatement.QueryExpression.OrderByClause.OrderByElements;
var c0 = _list[0].Expression as ColumnReferenceExpression;
var c1 = _list[1].Expression as ColumnReferenceExpression;
Assert.AreEqual("baz", c0.MultiPartIdentifier.Identifiers[0].Value);
Assert.AreEqual("Ascending", _list[0].SortOrder.ToString());
Assert.AreEqual("bar", c1.MultiPartIdentifier.Identifiers[0].Value);
Assert.AreEqual("Descending", _list[1].SortOrder.ToString());
}
}
このコードは正常に動作しますが、非常に紛らわしいと思います。「as」キーワードが奇妙に思える場所が 2 つあります。
これらの最初のものは 6 行目です。TsqlScript は TSqlFragment のサブクラスなので、サブクラスにキャストできたのは幸運だったと思います。しかし、3 行目の Parse メソッドの戻り値の型である TSqlFragment には有用なプロパティはなく、そのサブクラスだけに有用なプロパティがあります。では、たまたまクラスを別のものにキャストすることがわかっている場合にのみ役立つクラスを公開するのは、どのような種類の API でしょうか?
2 番目の "as" のより紛らわしい使用法は、内側の foreach で使用されます。ExpressionWithSortOrders を ColumnReferenceExpressions に変更した可能性はありますか? これらはインターフェイスではなくクラスであり、互いに継承しません。私が知る限り、それらは相互に明示的または暗黙的な変換を行っていません。
より一般的に言えば、このような API の操作をどのように学習できるでしょうか? このキャストについては、公式の scriptdom ドキュメントで何も見つかりませんでした。Visual Studio は、これらのクラスを相互に変換できることを教えてくれません。