Как определить, может ли столбец в SELECT быть нулевым?

Я использую DacFx во время разработки для создания слоя данных C#, который генерируется из файлов sql в проекте базы данных SSDT. Посмотрите мой проект SqlSharpener на Github, чтобы понять, о чем я говорю.

Я генерирую DTO-объекты, которые представляют строку, возвращаемую из инструкции SELECT хранимой процедуры. Чтобы определить, должно ли свойство в 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);

Проблема в том, что я не учел левые или правые внешние соединения, что также могло сделать значение пустым.

Как я могу определить, может ли столбец в операторе SELECT быть нулевым? Или, если этот вопрос слишком широкий, как я могу определить, пришел ли столбец из таблицы, которая была оставлена ​​внешней?

1 ответ

Решение

Я думаю, что нашел ответ. Учитывая QuerySpecification оператора SELECT, я могу получить список объединений, используя:

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

Каждый объект QualifiedJoin имеет свойство QualifiedJoinType, которое является перечислением, которое будет установлено как Inner, LeftOuter, RightOuter или FullOuter.

Другие вопросы по тегам