1

デザインタイムに DacFx を使用して、SSDT データベース プロジェクトの sql ファイルから生成される C# データ レイヤーを作成しています。私が話していることを確認するには、Github で私のSqlSharpener プロジェクトを参照してください。

ストアド プロシージャの SELECT ステートメントから返される行を表す DTO オブジェクトを生成しています。DTO のプロパティが null 許容値型であるべきかどうかを判断するために、元のテーブルで列が null 許容かどうかを確認しています。それがどのように見えるか興味がある場合は、ここにコードがあります。(ここの tSqlObject はTSqlObject、ストアド プロシージャのインスタンスです)

var bodyColumnTypes = tSqlObject.GetReferenced(dac.Procedure.BodyDependencies)
    .Where(x => x.ObjectType.Name == "Column")
    .GroupBy(bd => string.Join(".", bd.Name.Parts))
    .Select(grp => grp.First())
    .ToDictionary(
        key => string.Join(".", key.Name.Parts),
        val => new DataType
        {
            Map = DataTypeHelper.Instance.GetMap(TypeFormat.SqlServerDbType, val.GetReferenced(dac.Column.DataType).First().Name.Parts.Last()),
            Nullable = dac.Column.Nullable.GetValue<bool>(val)
        },
        StringComparer.InvariantCultureIgnoreCase);

問題は、左または右の外部結合を考慮していなかったため、値が null になる可能性があることです。

SELECT ステートメントの列が null になる可能性があるかどうかを判断するにはどうすればよいですか? または、その質問が広すぎる場合、列が外部結合されたままのテーブルからのものであるかどうかをどのように判断できますか?

4

1 に答える 1

0

私は答えを見つけたと思います。SELECT ステートメントの QuerySpecification を指定すると、次を使用して結合のリストを取得できます。

var joins = querySpecification.FromClause.TableReferences.OfType<QualifiedJoin>();

各 QualifiedJoin オブジェクトには、Inner、LeftOuter、RightOuter、または FullOuter として設定される列挙である QualifiedJoinType プロパティがあります。

于 2015-05-14T17:36:33.133 に答える