コード例 #1
0
 TObject ConstructObject(IReadOnlyDictionary <string, object?>?row, int?rowCount)
 {
     if (rowCount == 0 || row == null)
     {
         throw new MissingDataException($"No rows were returned. It was this expected, use `.ToObjectOrNull` instead of `.ToObject`.");
     }
     else if (rowCount > 1 && !m_RowOptions.HasFlag(RowOptions.DiscardExtraRows))
     {
         throw new UnexpectedDataException($"Expected 1 row but received {rowCount} rows. If this was expected, use `RowOptions.DiscardExtraRows`.");
     }
     return(MaterializerUtilities.ConstructObject <TObject>(row, Constructor, Converter));
 }
コード例 #2
0
 TObject?ConstructObject(IReadOnlyDictionary <string, object?>?row, int?rowCount)
 {
     if (rowCount == 0 || row == null)
     {
         if (!m_RowOptions.HasFlag(RowOptions.PreventEmptyResults))
         {
             return(null);
         }
         else
         {
             throw new MissingDataException($"No rows were returned and {nameof(RowOptions)}.{nameof(RowOptions.PreventEmptyResults)} was enabled.");
         }
     }
     else if (rowCount > 1 && !m_RowOptions.HasFlag(RowOptions.DiscardExtraRows))
     {
         throw new UnexpectedDataException($"Expected 1 row but received {rowCount} rows. If this was expected, use `RowOptions.DiscardExtraRows`.");
     }
     return(MaterializerUtilities.ConstructObject <TObject>(row, Constructor, Converter));
 }
コード例 #3
0
    List <TMaster> GenerateObjects(Table table)
    {
        IEqualityComparer <object> comparer;
        var columnType = table.ColumnTypeMap[m_MasterKeyColumn];

        if (columnType == typeof(short))
        {
            comparer = new Int16EqualityComparer();
        }
        else if (columnType == typeof(int))
        {
            comparer = new Int32EqualityComparer();
        }
        else if (columnType == typeof(long))
        {
            comparer = new Int64EqualityComparer();
        }
        else if (columnType == typeof(Guid))
        {
            comparer = new GuidEqualityComparer();
        }
        else if (columnType == typeof(string))
        {
            comparer = new StringEqualityComparer();
        }
        else if (columnType == typeof(DateTime))
        {
            comparer = new DateTimeEqualityComparer();
        }
        else if (columnType == typeof(DateTimeOffset))
        {
            comparer = new DateTimeOffsetEqualityComparer();
        }
        else if (columnType == typeof(ulong))
        {
            comparer = new UInt64EqualityComparer();
        }
        else
        {
            throw new NotSupportedException($"Key column of type '{columnType.Name}' is not supported for Master/Detail collections.");
        }

        var groups = new Dictionary <object, List <Row> >(comparer);

        foreach (var row in table.Rows)
        {
            var key = row[m_MasterKeyColumn];
            if (key == null)
            {
                throw new MissingDataException($"A null was found in the master key column '{m_MasterKeyColumn}'");
            }

            if (!groups.TryGetValue(key, out var group))
            {
                group = new();
                groups.Add(key, group);
            }
            group.Add(row);
        }

        var result = new List <TMaster>();

        foreach (var group in groups.Values)
        {
            var master = MaterializerUtilities.ConstructObject <TMaster>(group[0], m_MasterConstructor, Converter);
            var target = m_Map(master);
            foreach (var row in group)
            {
                target.Add(MaterializerUtilities.ConstructObject <TDetail>(row, m_DetailConstructor, Converter));
            }
            result.Add(master);
        }

        return(result);
    }