public EntityRecord ReadRecord(IDataRecord dataRecord, EntitySession session) { // Some outer join queries may produce entities that are null; so we first try to read Primary key values - if they're all null, we return null. if (_primaryKeyColumns.Count > 0 && PrimaryKeyIsNull(dataRecord)) { return(null); } var entRec = new EntityRecord(_tableInfo.Entity, EntityStatus.Loading); bool isView = _tableInfo.Entity.Kind == EntityKind.View; object dbValue = null; OutColumnMapping colMap = null; //for-i loop is more efficient than foreach for (int i = 0; i < _columns.Count; i++) { try { colMap = _columns[i]; var dbCol = colMap.DbColumn; var isNull = dataRecord.IsDBNull(colMap.ReaderColumnIndex); if (isNull) { // Views might have NULLs unexpectedly in columns like Count() or Sum() - LINQ expr has non-nullable type, but in fact // the view column can return NULL if (isView && !dbCol.Flags.IsSet(DbColumnFlags.Nullable)) { dbValue = dbCol.Member.DefaultValue; } else { dbValue = DBNull.Value; } } else { // not NULL dbValue = dbCol.TypeInfo.ColumnReader(dataRecord, colMap.ReaderColumnIndex); var conv = dbCol.Converter.ColumnToProperty; if (dbValue != null && conv != null) { dbValue = conv(dbValue); } // quick fix: views sometimes have out columns changed from expected if (isView && !ConvertHelper.UnderlyingTypesMatch(dbCol.Member.DataType, dbValue.GetType())) { dbValue = ConvertHelper.ChangeType(dbValue, dbCol.Member.DataType); } } var member = dbCol.Member; entRec.ValuesOriginal[member.ValueIndex] = dbValue; } catch (Exception ex) { ex.AddValue("DataRecord", dataRecord); ex.AddValue("ColumnName", colMap.DbColumn.ColumnName); ex.AddValue("DbValue", dbValue); throw; } } var sessionRec = session.Attach(entRec); //might return different, previously loaded record return(sessionRec); }
public EntityRecord ReadRecord(IDataRecord dataRecord, EntitySession session) { // Some outer join queries may produce entities that are null; so we first try to read Primary key values - if they're all null, we return null. if (_primaryKeyColumns.Count > 0 && PrimaryKeyIsNull(dataRecord)) { return(null); } var entRec = new EntityRecord(_tableInfo.Entity, EntityStatus.Loading); object dbValue = null; OutColumnMapping colMap = null; //for-i loop is more efficient than foreach for (int i = 0; i < _columns.Count; i++) { try { colMap = _columns[i]; dbValue = dataRecord[colMap.ReaderColumnIndex]; //System.Diagnostics.Debug.WriteLine(colMap.DbColumn.ColumnName + " " + dbValue + "(" + dbValue.GetType() + ")"); var conv = colMap.DbColumn.TypeInfo.ColumnToPropertyConverter; if (dbValue != null && conv != null) { dbValue = conv(dbValue); } entRec.SetValue(colMap.DbColumn.Member, dbValue); } catch (Exception ex) { ex.AddValue("DataRecord", dataRecord); ex.AddValue("ColumnName", colMap.DbColumn.ColumnName); ex.AddValue("DbValue", dbValue); throw; } } var sessionRec = session.Attach(entRec); //might return different, previously loaded record return(sessionRec); }
public OutColumnMapping AddColumn(DbColumnInfo column, int readerColumnIndex = -1) { if (readerColumnIndex == -1) readerColumnIndex = _columns.Count; var colMapping = new OutColumnMapping() { ReaderColumnIndex = readerColumnIndex, DbColumn = column }; _columns.Add(colMapping); if (column.Flags.IsSet(DbColumnFlags.PrimaryKey)) _primaryKeyColumns.Add(colMapping); return colMapping; }
public OutColumnMapping AddColumn(DbColumnInfo column, int readerColumnIndex = -1) { if (readerColumnIndex == -1) { readerColumnIndex = _columns.Count; } var colMapping = new OutColumnMapping() { ReaderColumnIndex = readerColumnIndex, DbColumn = column }; _columns.Add(colMapping); if (column.Flags.IsSet(DbColumnFlags.PrimaryKey)) { _primaryKeyColumns.Add(colMapping); } return(colMapping); }