Как определить, может ли столбец в 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.