0

すべて、私は次のようなSQLデータベースクラス構造を持っています

public class Database : ISqlObject, IComparable<Database>, IEquatable<Database>
{
    public string Name { get; set; }
    public ISqlObject Parent { get; set; }
    public string Filename { get; set; }
    internal List<Schema> Schemas { get; set; }
    internal List<Table> Tables { get; set; }
    internal List<Constraint> Constraints { get; set; }

    public Database(string name, string filename)
    {
        this.Name = name;
        this.Parent = (ISqlObject)this;
        this.Filename = filename;
    }
    ...
}

protected internal class Table : ISqlObject, IComparable<Table>
{
    public string Name { get; set; }
    public ISqlObject Parent { get; set; }
    public List<Column> Columns { get; set; }
    ...
}

protected internal class Column : ISqlObject, IComparable<Column>
{
    public string Name { get; set; }
    public ISqlObject Parent { get; set; }
    public string Type { get; set; }
    public int MaxLength { get; set; }
    public bool IsNullable { get; set; }
    public bool HasConstraints { get; set; }
    public List<Constraint> Constraints { get; set; }
    ...
}

protected internal class Constraint : IComparable<Constraint>
{
    public string Name { get; set; }
    public ISqlObject Parent { get; set; }
    public bool IsPk { get; set; }
    public string LinkedConstraintName { get; set; }
    public string LinkedColumnName { get; set; }
    public string LinkedTableName { get; set; }
    ...
}

IComparable省略形が実装やコンストラクターなどを表す場合。

LINQを使用して、現在の列に対応する制約を返す次のコードがありますが、一貫して取得していますlinkedConstraints = null

foreach (SqlServer.Column column in tableIndexDict[i].Columns)
{
    if (column.HasConstraints)
    {
        var linkedConstraints = 
            from table in database.Tables 
            from c in table.Columns 
            from con in c.Constraints 
                where con.LinkedTableName.Equals(tableIndexDict[i].Name) && 
                        con.LinkedColumnName.Equals(column.Name) 
            select con;
        foreach (SqlServer.Constraint c in linkedConstraints) <= HERE NullReference Exception.
        {

私はここで何が間違っているのですか?

注:スタックトレース:

at System.Linq.Enumerable.<SelectManyIterator>d__31`3.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at UserCost.Export.QlikViewExporter.BuildExclusionTable(Database database) in 
f:\UserCost\UserCost\UserCost\Export\SqlDataExportFactory.cs:line 302
4

1 に答える 1

2

linkedConstraintsnullラムダであるため、このシナリオに含めることはできません。

これを使用して、リンクされた制約があるかどうかを調べることができます。

linkedConstraints.Any();

編集

取得したデータを調べる必要があります。con.LinkedTableNameまたはcon.LinkedColumnNameがnullであると想定します。

于 2013-01-15T12:40:02.270 に答える