public DataReaderTestsSandbox() : base() { // Arrange by registering our fake services into the test container. FakeCrmDbConnection = this.RegisterMockInstance<CrmDbConnection>(); this.Container.Register<DbConnection>(FakeCrmDbConnection); CrmConnectionInfo connInfo = new CrmConnectionInfo(); connInfo.BusinessUnitId = Guid.NewGuid(); connInfo.OrganisationId = Guid.NewGuid(); connInfo.OrganisationName = "UnitTesting"; connInfo.ServerVersion = "1.0.0.0"; connInfo.UserId = Guid.NewGuid(); FakeCrmDbConnection.Stub(c => c.ConnectionInfo).Return(connInfo); SchemaTableProvider = new SchemaTableProvider(); this.Container.Register<ISchemaTableProvider>(SchemaTableProvider); // Singleton. // Create some fake results data FakeResultSet = new EntityResultSet(null, null, null); FakeResultSet.ColumnMetadata = new List<ColumnMetadata>(); var firstNameAttInfo = new StringAttributeInfo(); firstNameAttInfo.AttributeType = AttributeTypeCode.String; firstNameAttInfo.LogicalName = "firstname"; var firstNameC = new ColumnMetadata(firstNameAttInfo); var lastNameAttInfo = new StringAttributeInfo(); lastNameAttInfo.AttributeType = AttributeTypeCode.String; lastNameAttInfo.LogicalName = "lastname"; var lastnameC = new ColumnMetadata(lastNameAttInfo); FakeResultSet.ColumnMetadata.Add(firstNameC); FakeResultSet.ColumnMetadata.Add(lastnameC); FakeResultSet.Results = new EntityCollection(new List<Entity>()); var result = new Entity("contact"); result.Id = Guid.NewGuid(); result["firstname"] = "joe"; result["lastname"] = "schmoe"; FakeResultSet.Results.Entities.Add(result); this.Container.Register<EntityResultSet>(FakeResultSet); this.Container.Register<ResultSet>(FakeResultSet); }
private void InitMainGraphTableColumn(Type parentType, ColumnMetadata mainTableColumn) { //if (parentType.Name == "ApplicationUser") // Console.WriteLine($"{mainTableColumn.ColumnName} GraphType: {GraphUtils.ResolveGraphType(mainTableColumn.Type)} Type: {mainTableColumn.Type} IsList {mainTableColumn.IsList}"); // instancias internas if (mainTableColumn.IsJson) // incluye litas de cada objeto { Field( typeof(string).GetGraphTypeFromType(true), mainTableColumn.ColumnName, resolve: context => { var pi = parentType.GetProperty(mainTableColumn.ColumnName); dynamic value = pi.GetValue(context.Source); if (value == null) { return(null); } return(System.Text.Json.JsonSerializer.Serialize(value)); } ); FillArgs(mainTableColumn.ColumnName, mainTableColumn.Type); } else if (mainTableColumn.IsList) // incluye litas de cada objeto { var queryThirdArguments = new QueryArguments { new QueryArgument <IntGraphType> { Name = "first" }, new QueryArgument <StringGraphType> { Name = "orderBy" }, new QueryArgument <StringGraphType> { Name = "all" }, new QueryArgument <BooleanGraphType> { Name = "join" } }; var listObjectGraph = GetPrimaryListInstances(mainTableColumn, queryThirdArguments: queryThirdArguments, isList: true); var inherateType = typeof(CustomListResolver <>).MakeGenericType(new Type[] { mainTableColumn.Type }); dynamic resolver = Activator.CreateInstance(inherateType, new object[] { mainTableColumn.Type, parentType, _httpContextAccessor, _accessor, _dbMetadata }); AddField(new FieldType { Name = $"{mainTableColumn.ColumnName}", ResolvedType = listObjectGraph, Arguments = queryThirdArguments, Resolver = resolver }); } else if (typeof(IBaseModel).IsAssignableFrom(mainTableColumn.Type) || _dbMetadata.GetTableMetadatas().Any(x => x.Type == mainTableColumn.Type)) { GetInternalInstances(mainTableColumn); } else if (mainTableColumn.Type == typeof(Point) || mainTableColumn.Type == typeof(Coordinate) || mainTableColumn.Type == typeof(LineString) || mainTableColumn.Type == typeof(Polygon) || mainTableColumn.Type == typeof(MultiLineString)) { Field( typeof(string).GetGraphTypeFromType(true), mainTableColumn.ColumnName, resolve: context => { var pi = parentType.GetProperty(mainTableColumn.ColumnName); dynamic point = pi.GetValue(context.Source); if (point == null) { return(null); } return(JsonExtensions.SerializeWithGeoJson(point, formatting: Formatting.None)); } ); FillArgs(mainTableColumn.ColumnName, mainTableColumn.Type); } else if (mainTableColumn.Type == typeof(TimeSpan)) { Field( typeof(string).GetGraphTypeFromType(true), mainTableColumn.ColumnName, resolve: context => { var pi = parentType.GetProperty(mainTableColumn.ColumnName); var value = pi.GetValue(context.Source); if (value == null) { return(null); } return(((TimeSpan)value).ToString()); } ); FillArgs(mainTableColumn.ColumnName, mainTableColumn.Type); } else { Field( GraphUtils.ResolveGraphType(mainTableColumn.Type), mainTableColumn.ColumnName ); FillArgs(mainTableColumn.ColumnName, mainTableColumn.Type); if (mainTableColumn.Type.IsEnum) { FillArgs($"{mainTableColumn.ColumnName}_enum", typeof(int)); AddField( new FieldType { Type = typeof(int).GetGraphTypeFromType(true), Name = $"{mainTableColumn.ColumnName}_value", Resolver = new EnumResolver(parentType, mainTableColumn.ColumnName) } ); } } }
private dynamic GetThirdGraphType(TableMetadata metaTable, ColumnMetadata columnMetadata, QueryArguments queryArguments) { string key = $"Third_{columnMetadata.Type.Name}"; dynamic objectGraphInternal = null; if (!_tableNameLookup.ExistGraphType(key)) { var inherateType = typeof(ObjectGraphType <>).MakeGenericType(new Type[] { metaTable.Type }); objectGraphInternal = Activator.CreateInstance(inherateType); objectGraphInternal.Name = key; var permission = columnMetadata.Type.Name.ToLower(); var friendlyTableName = Generic.StringExt.CanonicalName(Utilities.StringExt.ToSnakeCase(columnMetadata.Type.Name)); foreach (var tableColumn in metaTable.Columns) { if (tableColumn.IsJson) { objectGraphInternal.AddField( new FieldType { Type = typeof(string).GetGraphTypeFromType(true), Name = tableColumn.ColumnName, Resolver = new JsonResolver(metaTable.Type, tableColumn.ColumnName) } ); FillArguments(queryArguments, tableColumn.ColumnName, tableColumn.Type); } else if (tableColumn.IsList) { try { var queryThirdArguments = new QueryArguments { new QueryArgument <StringGraphType> { Name = "all" } }; var metaTableInherit = _dbMetadata.GetTableMetadatas().FirstOrDefault(x => x.Type.Name == tableColumn.Type.Name); var listObjectGraph = GetFourthGraphType(metaTableInherit, tableColumn, queryThirdArguments, isList: true); objectGraphInternal.AddField(new FieldType { Name = $"{tableColumn.ColumnName}", ResolvedType = listObjectGraph, Arguments = queryThirdArguments }); } catch (Exception e) { Console.WriteLine(e.ToString()); objectGraphInternal.Field( GraphUtils.ResolveGraphType(typeof(string)), tableColumn.ColumnName ); FillArguments(queryArguments, tableColumn.ColumnName, tableColumn.Type); } } else if (typeof(IBaseModel).IsAssignableFrom(tableColumn.Type) || _dbMetadata.GetTableMetadatas().Any(x => x.Type == tableColumn.Type)) { var queryThirdArguments = new QueryArguments { new QueryArgument <StringGraphType> { Name = "all" } }; var metaTableInherit = _dbMetadata.GetTableMetadatas().FirstOrDefault(x => x.Type.Name == tableColumn.Type.Name); var tableType = GetFourthGraphType(metaTableInherit, tableColumn, queryThirdArguments); objectGraphInternal.AddField(new FieldType { Name = $"{tableColumn.ColumnName}", ResolvedType = tableType, Arguments = queryThirdArguments }); } else if (columnMetadata.Type == typeof(Point) || columnMetadata.Type == typeof(Coordinate) || columnMetadata.Type == typeof(LineString) || columnMetadata.Type == typeof(Polygon) || columnMetadata.Type == typeof(MultiLineString)) { objectGraphInternal.AddField( new FieldType { Type = typeof(string).GetGraphTypeFromType(true), Name = columnMetadata.ColumnName, Resolver = new PointResolver(metaTable.Type, columnMetadata.ColumnName) } ); FillArguments(queryArguments, columnMetadata.ColumnName, columnMetadata.Type); } else if (tableColumn.Type == typeof(TimeSpan)) { objectGraphInternal.AddField( new FieldType { Type = typeof(string).GetGraphTypeFromType(true), Name = tableColumn.ColumnName, Resolver = new TimeSpanResolver(metaTable.Type, tableColumn.ColumnName) } ); FillArguments(queryArguments, tableColumn.ColumnName, tableColumn.Type); } else { objectGraphInternal.Field( GraphUtils.ResolveGraphType(tableColumn.Type), tableColumn.ColumnName ); FillArguments(queryArguments, tableColumn.ColumnName, tableColumn.Type); if (columnMetadata.Type.IsEnum) { FillArguments(queryArguments, $"{columnMetadata.ColumnName}_enum", typeof(int)); objectGraphInternal.AddField( new FieldType { Type = typeof(int).GetGraphTypeFromType(true), Name = $"{columnMetadata.ColumnName}_value", Resolver = new EnumResolver(metaTable.Type, columnMetadata.ColumnName) } ); } } } } else { foreach (var tableColumn in metaTable.Columns) { FillArguments(queryArguments, tableColumn.ColumnName, tableColumn.Type); } } return(_tableNameLookup.GetOrInsertGraphType(key, objectGraphInternal)); }
/// <summary> /// Initializes a new instance of the IndexColumnMetadata class. /// </summary> /// <param name="column">The underlying column details.</param> /// <param name="isDescending">Indicates the column is indexed in descending order.</param> /// <param name="isIncluded">Indicates the column is an unindexed, included column.</param> public IndexColumnMetadata(ColumnMetadata <TDbType> column, bool?isDescending, bool isIncluded) : base(column, isDescending, isIncluded) { Details = column; }
MultipleRowDbCommandBuilder <NpgsqlCommand, NpgsqlParameter> GetByKeyList <T>(PostgreSqlObjectName tableName, ColumnMetadata <NpgsqlDbType> columnMetadata, IEnumerable <T> keys) { var keyList = keys.AsList(); string where; if (keys.Count() > 1) { where = columnMetadata.SqlName + " IN (" + string.Join(", ", keyList.Select((s, i) => "@Param" + i)) + ")"; } else { where = columnMetadata.SqlName + " = @Param0"; } var parameters = new List <NpgsqlParameter>(); for (var i = 0; i < keyList.Count; i++) { var param = new NpgsqlParameter("@Param" + i, keyList[i]); if (columnMetadata.DbType.HasValue) { param.NpgsqlDbType = columnMetadata.DbType.Value; } parameters.Add(param); } return(new PostgreSqlTableOrView(this, tableName, where, parameters)); }
MultipleRowDbCommandBuilder <SqlCommand, SqlParameter, TObject> OnGetByKeyList <TObject, TKey>(SqlServerObjectName tableName, ColumnMetadata <SqlDbType> columnMetadata, IEnumerable <TKey> keys) where TObject : class { var keyList = keys.AsList(); string where; if (keys.Count() > 1) { where = columnMetadata.SqlName + " IN (" + string.Join(", ", keyList.Select((s, i) => "@Param" + i)) + ")"; } else { where = columnMetadata.SqlName + " = @Param0"; } var parameters = new List <SqlParameter>(); for (var i = 0; i < keyList.Count; i++) { var param = new SqlParameter("@Param" + i, keyList[i]); if (columnMetadata.DbType.HasValue) { param.SqlDbType = columnMetadata.DbType.Value; } parameters.Add(param); } return(new MultipleRowDbCommandBuilder <SqlCommand, SqlParameter, TObject>(new SqlServerTableOrView <TObject>(this, tableName, where, parameters))); }
/// <summary> /// 获取指定列的值生成对象。 /// </summary> /// <param name="column">指定数据列元数据。</param> /// <returns>值生成对象。</returns> protected abstract ValueGenerateBase GetValueGenerator(ColumnMetadata column);
PostgreSqlTableOrView <TObject> OnGetByKey <TObject, TKey>(PostgreSqlObjectName tableName, ColumnMetadata <NpgsqlDbType> columnMetadata, TKey key) where TObject : class { string where = columnMetadata.SqlName + " = @Param0"; var parameters = new List <NpgsqlParameter>(); var param = new NpgsqlParameter("@Param0", key); if (columnMetadata.DbType.HasValue) { param.NpgsqlDbType = columnMetadata.DbType.Value; } parameters.Add(param); return(new PostgreSqlTableOrView <TObject>(this, tableName, where, parameters)); }
MultipleRowDbCommandBuilder <AbstractCommand, AbstractParameter> IGetByKeyHelper <AbstractCommand, AbstractParameter, AbstractObjectName, AbstractDbType> .OnGetByKeyList <TObject, TKey>(AbstractObjectName tableName, ColumnMetadata <AbstractDbType> keyColumn, IEnumerable <TKey> keys) where TObject : class { var keyList = keys.AsList(); string where; if (keys.Count() > 1) { where = keyColumn.SqlName + " IN (" + string.Join(", ", keyList.Select((s, i) => "@Param" + i)) + ")"; } else { where = keyColumn.SqlName + " = @Param0"; } var parameters = new List <OleDbParameter>(); for (var i = 0; i < keyList.Count; i++) { var param = new OleDbParameter("@Param" + i, keyList[i]); if (keyColumn.DbType.HasValue) { param.OleDbType = keyColumn.DbType.Value; } parameters.Add(param); } return(new MultipleRowDbCommandBuilder <OleDbCommand, OleDbParameter, TObject>(new AccessTableOrView <TObject>(this, tableName, where, parameters))); }
MultipleRowDbCommandBuilder <AbstractCommand, AbstractParameter> IGetByKeyHelper <AbstractCommand, AbstractParameter, AbstractObjectName, AbstractDbType> .OnGetByKey <TObject, TKey>(AbstractObjectName tableName, ColumnMetadata <AbstractDbType> keyColumn, TKey key) where TObject : class { string where = keyColumn.SqlName + " = @Param0"; var parameters = new List <OleDbParameter>(); var param = new OleDbParameter("@Param0", key); if (keyColumn.DbType.HasValue) { param.OleDbType = keyColumn.DbType.Value; } parameters.Add(param); return(new AccessTableOrView <TObject>(this, tableName, where, parameters)); }
/// <summary> /// Create table function/stored procedure result set model using existing entity or custom model. /// </summary> /// <param name="funcName">Database name for function/procedure.</param> /// <param name="columns">Result set columns schema. Must be ordered by ordinal.</param> /// <returns>Model for result set.</returns> private FunctionResult PrepareResultSetModel(SqlObjectName funcName, IReadOnlyCollection <ResultColumn> columns) { // try to find entity model with same set of columns // column equality check includes: name, database type and nullability if (_options.DataModel.MapProcedureResultToEntity) { var names = new Dictionary <string, (DatabaseType type, bool isNullable)>(); foreach (var column in columns) { // columns without name or duplicate names indicate that it is not entity and requires custom // mapper with by-ordinal mapping if (string.IsNullOrEmpty(column.Name) || names.ContainsKey(column.Name !)) { break; } names.Add(column.Name !, (column.Type, column.Nullable)); } if (names.Count == columns.Count) { foreach (var(schemaObject, entity) in _entities.Values) { if (schemaObject.Columns.Count == names.Count) { var match = true; foreach (var column in schemaObject.Columns) { if (!names.TryGetValue(column.Name, out var columnType) || !column.Type.Equals(columnType.type) || column.Nullable != columnType.isNullable) { match = false; break; } } if (match) { return(new FunctionResult(null, _entities[schemaObject.Name].Entity, null)); } } } } } var resultClass = new ClassModel( _namingServices.NormalizeIdentifier( _options.DataModel.ProcedureResultClassNameOptions, (funcName.Package != null ? $"{funcName.Package}_" : null) + funcName.Name)) { Modifiers = Modifiers.Partial | Modifiers.Public }; var model = new ResultTableModel(resultClass); foreach (var col in columns) { var typeMapping = MapType(col.Type); var metadata = new ColumnMetadata() { Name = col.Name ?? string.Empty, DbType = _options.DataModel.GenerateDbType ? col.Type : null, DataType = _options.DataModel.GenerateDataType ? typeMapping.DataType : null, CanBeNull = col.Nullable }; var property = new PropertyModel( _namingServices.NormalizeIdentifier(_options.DataModel.ProcedureResultColumnPropertyNameOptions, col.Name ?? "Column"), typeMapping.CLRType.WithNullability(col.Nullable)) { Modifiers = Modifiers.Public, HasSetter = true, IsDefault = true, }; var colModel = new ColumnModel(metadata, property); model.Columns.Add(colModel); } return(new FunctionResult(model, null, null)); }
AccessTableOrView <TObject> OnGetByKey <TObject, TKey>(AccessObjectName tableName, ColumnMetadata <OleDbType> columnMetadata, TKey key) where TObject : class { string where = columnMetadata.SqlName + " = @Param0"; var parameters = new List <OleDbParameter>(); var param = new OleDbParameter("@Param0", key); if (columnMetadata.DbType.HasValue) { param.OleDbType = columnMetadata.DbType.Value; } parameters.Add(param); return(new AccessTableOrView <TObject>(this, tableName, where, parameters)); }
/// <summary> /// 根据列元数据获取相应的值生成对象。 /// </summary> /// <param name="column">列元数据。</param> /// <returns>值生成对象。</returns> public abstract ValueGenerateBase GetValueGenerator(ColumnMetadata column);
/// <summary> /// 创建普通提交成员。 /// </summary> /// <param name="metadata">列元数据。</param> /// <param name="gnerator">值生成器。</param> /// <param name="columnType">列提交类型。</param> public CommitMember(ColumnMetadata metadata, ValueGenerateBase gnerator, ECommitValueType columnType) { Metadata = metadata; Generator = gnerator; ValueType = columnType; }
/// <summary> /// 创建普通提交成员。 /// </summary> /// <param name="metadata">列元数据。</param> public CommitMember(ColumnMetadata metadata) : this(metadata, null, ECommitValueType.Constant) { }
/// <summary> /// Initialeses DataGrid And Generates Columns From The Bound ViewModels Grid Fields /// </summary> /// <param name="gridSectionViewModel"></param> /// <param name="dynamicDataGrid"></param> public static void CreateDataGrid(DynamicGridViewModel gridSectionViewModel, DataGrid dynamicDataGrid) { //want to do any service calls asynchronously dynamicDataGrid.CanUserAddRows = false; dynamicDataGrid.Columns.Clear(); if (gridSectionViewModel != null) { gridSectionViewModel.ApplicationController.DoOnAsyncThread(() => { if (gridSectionViewModel.FieldMetadata == null) { return; } var columnMetadata = new List <ColumnMetadata>(); foreach (var gridField in gridSectionViewModel.FieldMetadata.OrderBy(gf => gf.Order)) { var fieldName = gridField.FieldName; var fieldType = gridSectionViewModel.RecordService.GetFieldType(fieldName, gridSectionViewModel .RecordType); var header = gridSectionViewModel.RecordService.GetFieldLabel(fieldName, gridSectionViewModel.RecordType); var thisColumn = new ColumnMetadata(fieldName, header, fieldType, gridField.WidthPart, gridField.IsEditable); columnMetadata.Add(thisColumn); } gridSectionViewModel.ApplicationController.DoOnMainThread(() => { if (gridSectionViewModel.CanDelete) { var deleteColumn = new DeleteRowColumn(); deleteColumn.Binding = new Binding("DeleteRowViewModel"); dynamicDataGrid.Columns.Add(deleteColumn); } if (gridSectionViewModel.CanEdit) { var editColumn = new EditRowColumn(); editColumn.Binding = new Binding("EditRowViewModel"); dynamicDataGrid.Columns.Add(editColumn); } foreach (var column in columnMetadata) { var cellBinding = new Binding { Path = new PropertyPath(string.Concat("[", column.FieldName, "]")), Mode = BindingMode.TwoWay }; DataGridColumn dataGridField; if (column.FieldType == RecordFieldType.Boolean) { dataGridField = new GridBooleanColumn { Binding = cellBinding } } ; else if (column.FieldType == RecordFieldType.RecordType) { dataGridField = new GridPicklistColumn() { Binding = cellBinding } } ; else if (column.FieldType == RecordFieldType.RecordField) { var metadata = gridSectionViewModel.RecordService.GetFieldMetadata(column.FieldName, gridSectionViewModel.RecordType); if (metadata.IsMultiSelect) { dataGridField = new GridMultiSelectColumn() { Binding = cellBinding }; } else { dataGridField = new GridPicklistColumn() { Binding = cellBinding }; } } else if (column.FieldType == RecordFieldType.Picklist) { var metadata = gridSectionViewModel.RecordService.GetFieldMetadata(column.FieldName, gridSectionViewModel.RecordType); if (metadata.IsMultiSelect) { dataGridField = new GridMultiSelectColumn() { Binding = cellBinding }; } else { dataGridField = new GridPicklistColumn() { Binding = cellBinding }; } } else if (column.FieldType == RecordFieldType.Lookup) { if (gridSectionViewModel.FormController.FormService != null && gridSectionViewModel.FormController.FormService.UsePicklist(column.FieldName, gridSectionViewModel.RecordType)) { dataGridField = new GridLookupPicklistColumn() { Binding = cellBinding }; } else { dataGridField = new GridLookupColumn() { Binding = cellBinding }; } } else if (column.FieldType == RecordFieldType.Password) { dataGridField = new GridPasswordColumn() { Binding = cellBinding }; } else if (column.FieldType == RecordFieldType.Enumerable) { dataGridField = new GridEnumerableColumn() { Binding = cellBinding }; } else if (column.FieldType == RecordFieldType.Object) { dataGridField = new GridLookupPicklistColumn() { Binding = cellBinding }; } else if (column.FieldType == RecordFieldType.FileRef) { dataGridField = new GridFileRefColumn() { Binding = cellBinding }; } else if (column.FieldType == RecordFieldType.Integer) { var format = gridSectionViewModel.RecordService.GetIntegerFormat(column.FieldName, gridSectionViewModel.RecordType); if (format == IntegerType.TimeZone || format == IntegerType.Language) { dataGridField = new GridIntPicklistColumn() { Binding = cellBinding }; } else { dataGridField = new GridIntColumn() { Binding = cellBinding }; } } else if (column.FieldType == RecordFieldType.BigInt) { dataGridField = new GridIntColumn() { Binding = cellBinding }; } else if (column.FieldType == RecordFieldType.Date) { dataGridField = new GridDateColumn() { Binding = cellBinding }; } else if (column.FieldType == RecordFieldType.Decimal) { dataGridField = new GridDecimalColumn() { Binding = cellBinding }; } else if (column.FieldType == RecordFieldType.Double) { dataGridField = new GridDoubleColumn() { Binding = cellBinding }; } else if (column.FieldType == RecordFieldType.Money) { dataGridField = new GridMoneyColumn() { Binding = cellBinding }; } else if (column.FieldType == RecordFieldType.Url) { dataGridField = new GridUrlColumn() { Binding = cellBinding }; } else if (column.FieldType == RecordFieldType.ActivityParty) { dataGridField = new GridActivityPartyColumn() { Binding = cellBinding }; } else { dataGridField = new GridStringColumn() { Binding = cellBinding }; } dataGridField.Header = column.FieldLabel; dataGridField.Width = new DataGridLength(column.WidthPart, DataGridLengthUnitType.Pixel); var isFormReadonly = gridSectionViewModel.IsReadOnly; var isWriteable = gridSectionViewModel?.RecordService?.GetFieldMetadata(column.FieldName, gridSectionViewModel.RecordType).Createable == true || gridSectionViewModel?.RecordService?.GetFieldMetadata(column.FieldName, gridSectionViewModel.RecordType).Writeable == true; dataGridField.IsReadOnly = isFormReadonly || !isWriteable; var description = gridSectionViewModel?.RecordService?.GetFieldMetadata(column.FieldName, gridSectionViewModel.RecordType).Description; dynamicDataGrid.Columns.Add(dataGridField); } var dataGridBinding = new Binding { Path = new PropertyPath("GridRecords"), Mode = BindingMode.TwoWay }; dynamicDataGrid.SetBinding(ItemsControl.ItemsSourceProperty, dataGridBinding); var selectedItemBinding = new Binding { Path = new PropertyPath("SelectedRow"), Mode = BindingMode.TwoWay }; dynamicDataGrid.SetBinding(Selector.SelectedItemProperty, selectedItemBinding); }); }); } }
public BufferConverter Compile(MetadataIdentity metadata, ColumnMetadata columnInfo) { IBindingMetadata binding = metadata.Lookup <IBindingMetadata>(); ParameterExpression inputParam = Expression.Parameter(typeof(object)); ParameterExpression helperParam = Expression.Parameter(typeof(object)); ParameterExpression helperVariable = this.GetHelperVariable(binding); Expression value = inputParam; if (binding != null) { Type sourceType = null; if (columnInfo != null) { BindingColumnInfo bindingColumnInfo = new BindingColumnInfo() { Column = columnInfo, CanBeNull = true, Metadata = binding, }; sourceType = binding.Value?.Read(bindingColumnInfo)?.ReturnType; } BindingValueInfo valueInfo = new BindingValueInfo() { CanBeNull = true, CanBeDbNull = true, Metadata = binding, Value = value, SourceType = sourceType, TargetType = binding.Type, Helper = helperVariable, }; try { value = binding.Value?.Convert?.Invoke(valueInfo) ?? inputParam; } catch (BindingException) { throw; } catch (Exception ex) { throw BindingException.InvalidCast(binding, ex); } } value = this.GetObjectExpression(value); if (helperVariable != null) { Expression typedParam = Expression.Convert(helperParam, helperVariable.Type); Expression assignHelper = Expression.Assign(helperVariable, typedParam); value = Expression.Block(new[] { helperVariable }, assignHelper, value); } BufferInternalConverter innerFunc = Expression.Lambda <BufferInternalConverter>(value, inputParam, helperParam).Compile(); object helperObject = binding?.Helper?.Object; return(value => innerFunc(value, helperObject)); }
private GameObject CreateCloudPoint(List <float[]> columnDataList, string file_path = null, bool isJSON = false, string json_path = null) { GameObject container = Instantiate(_cloudPointPrefab) as GameObject; /// GameObject that is the parent of the CloudPoint (used for CloudParent offset) GameObject root = container.transform.Find("CloudPoint").gameObject; /// GameObject where the mesh will be displayed // Init Cloud Status and references CloudData rootdata = root.GetComponent <CloudData>(); rootdata.columnData = columnDataList; if (isJSON && json_path != null) { LoadJSON(json_path, rootdata); } else { int[] intarray = new int[9] { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; for (int i = 0; i < columnDataList.Count; i++) { if (i < intarray.Length) { intarray[i] = i; } } rootdata.globalMetaData.displayCollumnsConfiguration = intarray; } for (int j = 0; j < columnDataList.Count; j++) { ColumnMetadata metadata = new ColumnMetadata(); metadata.ColumnID = j; metadata.MinValue = Mathf.Infinity; metadata.MaxValue = Mathf.NegativeInfinity; metadata.Range = 0; metadata.MinThreshold = 0; metadata.MaxThreshold = 0; rootdata.globalMetaData.columnMetaDataList.Add(metadata); } for (int i = 0; i < columnDataList[0].Length; i++) { rootdata.CreatePointData(i, Vector3.zero, Vector3.zero, 0f, 0f, 0f, Color.black, 0f); rootdata.CreatePointMetaData(i, 0); for (int j = 0; j < columnDataList.Count; j++) { float nbr = columnDataList[j][i]; if (nbr < rootdata.globalMetaData.columnMetaDataList[j].MinValue) { rootdata.globalMetaData.columnMetaDataList[j].MinValue = nbr; } if (nbr > rootdata.globalMetaData.columnMetaDataList[j].MaxValue) { rootdata.globalMetaData.columnMetaDataList[j].MaxValue = nbr; } } foreach (ColumnMetadata md in rootdata.globalMetaData.columnMetaDataList) { md.MaxThreshold = md.MaxValue; md.MinThreshold = md.MinValue; md.Range = md.MaxValue - md.MinValue; } } LoadCloudData(rootdata, file_path, isJSON); root.name = "CloudPoint"; root.transform.position = container.transform.position; root.transform.localScale = new Vector3(1, 1, 1); CloudBox box = root.AddComponent <CloudBox>(); box.Activate(); container.GetComponent <CloudObjectRefference>().cloud = root; return(root); }
/// <summary> /// Initializes a new instance of the IndexColumnMetadata class. /// </summary> /// <param name="column">The underlying column details.</param> /// <param name="isDescending">Indicates the column is indexed in descending order.</param> /// <param name="isIncluded">Indicates the column is an unindexed, included column.</param> /// <param name="indexId"></param> internal SqlServerIndexColumnMetadata(ColumnMetadata <SqlDbType> column, bool?isDescending, bool isIncluded, int indexId) : base(column, isDescending, isIncluded) { IndexId = indexId; }
SqlServerTableOrView <TObject> OnGetByKey <TObject, TKey>(SqlServerObjectName tableName, ColumnMetadata <SqlDbType> columnMetadata, TKey key) where TObject : class { var where = columnMetadata.SqlName + " = @Param0"; var parameters = new List <SqlParameter>(); var param = new SqlParameter("@Param0", key); if (columnMetadata.DbType.HasValue) { param.SqlDbType = columnMetadata.DbType.Value; } parameters.Add(param); return(new SqlServerTableOrView <TObject>(this, tableName, where, parameters)); }
/// <summary> /// Initializes a new instance of the <see cref="ColumnPropertyMap{TDbType}"/> class. /// </summary> /// <param name="column">The column.</param> /// <param name="property">The property.</param> public ColumnPropertyMap(ColumnMetadata <TDbType> column, PropertyMetadata property) { Column = column; Property = property; }
/// <inheritdoc/> protected override ValueGenerateBase GetValueGenerator(ColumnMetadata column) => column.GeneratedForInsert;
/// <summary> /// 根据列元数据获取成员语句。 /// </summary> /// <param name="metadata">列元数据。</param> /// <returns>成员语句。</returns> public virtual IMemberFragment GetMember(ColumnMetadata metadata) => GetMember(metadata.Member);
public void Validate(ICustomAutoGeneratedServiceInfo customAutoGeneratedServiceInfo) { _repositoryInterfaceType = customAutoGeneratedServiceInfo.ImplementedInterface; if (!_repositoryInterfaceType.IsInterface) { throw new Exception($"The repository class should be an interface. The class is '{_repositoryInterfaceType.FullName}'."); } if (_repositoryInterfaceType.GetInterfaces().Length > 0) { throw new Exception($"The repository interface'{_repositoryInterfaceType.FullName}' cannot have base interfaces."); } var attribute = _repositoryInterfaceType.GetCustomAttributes().FirstOrDefault(x => x.GetType() == typeof(DataRepositoryAttribute)); if (attribute is not DataRepositoryAttribute dataRepositoryAttribute) { throw new Exception($"Attribute '{typeof(DataRepositoryAttribute)}' is missing in data repository '{_repositoryInterfaceType}'."); } if (_repositoryInterfaceType.GetProperties().ToList().Count > 0) { throw new Exception($"No properties are supported in repository interfaces that use attribute '{typeof(DataRepositoryAttribute)}'."); } _databaseEntityType = dataRepositoryAttribute.DatabaseEntityType; foreach (var methodInfo in _repositoryInterfaceType.GetMethods()) { var attributes = methodInfo.GetCustomAttributes().ToList(); if (attributes.Count == 0) { var validAttributeTypes = new Type[] { typeof(RepositoryMethodMetadataForAddAttribute), typeof(RepositoryMethodMetadataForAddOrUpdateAttribute), typeof(RepositoryMethodMetadataForDeleteAttribute), typeof(RepositoryMethodMetadataForSelectAttribute) }; throw new Exception($"Only methods with one of the following attributes are supported in repository interface '{_repositoryInterfaceType}': {string.Join(",", validAttributeTypes.Select(x => x.FullName))}."); } foreach (var currentAttribute in attributes) { if (currentAttribute is RepositoryMethodMetadataForAddAttribute repositoryMethodMetadataForAddAttribute) { ValidateRepositoryMethodSignature(methodInfo, new[] { _databaseEntityType }, new TypeInfo(_databaseEntityType)); _repositoryMethodMetadataForAdd.Add(new RepositoryMethodMetadata <RepositoryMethodMetadataForAddAttribute>(repositoryMethodMetadataForAddAttribute, methodInfo)); } else if (currentAttribute is RepositoryMethodMetadataForAddOrUpdateAttribute repositoryMethodMetadataForAddOrUpdateAttribute) { ValidateRepositoryMethodSignature(methodInfo, new[] { _databaseEntityType }, new TypeInfo(_databaseEntityType)); _repositoryMethodMetadataForAddOrUpdate.Add(new RepositoryMethodMetadata <RepositoryMethodMetadataForAddOrUpdateAttribute>(repositoryMethodMetadataForAddOrUpdateAttribute, methodInfo)); } else if (currentAttribute is RepositoryMethodMetadataForDeleteAttribute repositoryMethodMetadataForDeleteAttribute) { ValidateRepositoryMethodSignature(methodInfo, new[] { _databaseEntityType }, new TypeInfo("System", "Void")); _repositoryMethodMetadataForDelete.Add(new RepositoryMethodMetadata <RepositoryMethodMetadataForDeleteAttribute>(repositoryMethodMetadataForDeleteAttribute, methodInfo)); } else if (currentAttribute is RepositoryMethodMetadataForSelectAttribute repositoryMethodMetadataForSelectAttribute) { if (repositoryMethodMetadataForSelectAttribute.IsSelectAll) { ValidateRepositoryMethodSignature(methodInfo, Type.EmptyTypes, new TypeInfo("System.Collections.Generic", "IReadOnlyList`1", new List <Type> { _databaseEntityType })); _repositoryMethodMetadataForSelectAll.Add(new RepositoryMethodMetadata <RepositoryMethodMetadataForSelectAttribute>(repositoryMethodMetadataForSelectAttribute, methodInfo)); } else { ValidateRepositoryMethodSignature(methodInfo, new Type[] { typeof(long) }, new TypeInfo(_databaseEntityType)); _repositoryMethodMetadataForSelectSingle.Add(new RepositoryMethodMetadata <RepositoryMethodMetadataForSelectAttribute>(repositoryMethodMetadataForSelectAttribute, methodInfo)); } } else { throw new Exception($"Invalid attribute specified for repository interface '{_repositoryInterfaceType}'."); } } } attribute = _databaseEntityType.GetCustomAttributes().FirstOrDefault(x => x.GetType() == typeof(DatabaseEntityAttribute)); _databaseEntityAttribute = attribute as DatabaseEntityAttribute; if (_databaseEntityAttribute == null) { throw new Exception($"Attribute '{typeof(DatabaseEntityAttribute)}' is missing in data repository entity class '{dataRepositoryAttribute.DatabaseEntityType}' in repository '{_repositoryInterfaceType}'."); } foreach (var propertyInfo in _databaseEntityType.GetProperties()) { var attributes = propertyInfo.GetCustomAttributes(); foreach (var currentAttribute in attributes) { if (currentAttribute is not ColumnAttribute columnAttribute) { continue; } var columnMetadata = new ColumnMetadata(columnAttribute, propertyInfo); if (columnAttribute.IsKeyAttribute) { if (_keyColumnMetadata == null) { _keyColumnMetadata = columnMetadata; } else { LogHelper.Context.Log.ErrorFormat("Only one key column attribute can be specified. Column {0} will not be used as a key column. Entity type with multiple key columns: '{1}'.", columnMetadata.ColumnName, _databaseEntityType); } } _columnsMetadata.Add(columnMetadata); } } if (_keyColumnMetadata == null) { throw new Exception($"No key column was specified in database entity type '{_databaseEntityType}'."); } }
public IActionResult Post([FromBody] ColumnMetadata value) => value switch { null => BadRequest(),
private void InitGraphTableColumn(Type parentType, ColumnMetadata columnMetadata, dynamic objectGraphType, QueryArguments queryArguments) { if (columnMetadata.IsJson) { objectGraphType.AddField( new FieldType { Type = typeof(string).GetGraphTypeFromType(true), Name = columnMetadata.ColumnName, Resolver = new JsonResolver(parentType, columnMetadata.ColumnName) } ); FillArguments(queryArguments, columnMetadata.ColumnName, columnMetadata.Type); } else if (columnMetadata.IsList) // incluye litas de cada objeto { try { var queryThirdArguments = new QueryArguments { new QueryArgument <IntGraphType> { Name = "first" }, new QueryArgument <StringGraphType> { Name = "orderBy" }, new QueryArgument <StringGraphType> { Name = "all" }, }; var listObjectGraph = GetInternalListInstances(columnMetadata, queryThirdArguments: queryThirdArguments); var inherateType = typeof(CustomListResolver <>).MakeGenericType(new Type[] { columnMetadata.Type }); dynamic resolver = Activator.CreateInstance(inherateType, new object[] { columnMetadata.Type, parentType, _httpContextAccessor, _accessor, _dbMetadata }); objectGraphType.AddField(new FieldType { Name = $"{columnMetadata.ColumnName}", ResolvedType = listObjectGraph, Arguments = queryThirdArguments, Resolver = resolver }); } catch (Exception e) { Console.WriteLine(e.ToString()); objectGraphType.Field( GraphUtils.ResolveGraphType(columnMetadata.Type), columnMetadata.ColumnName ); FillArguments(queryArguments, columnMetadata.ColumnName, columnMetadata.Type); } } else if (typeof(IBaseModel).IsAssignableFrom(columnMetadata.Type) || _dbMetadata.GetTableMetadatas().Any(x => x.Type == columnMetadata.Type)) { var queryThirdArguments = new QueryArguments { new QueryArgument <StringGraphType> { Name = "all" } }; var metaTable = _dbMetadata.GetTableMetadatas().FirstOrDefault(x => x.Type.Name == columnMetadata.Type.Name); var tableType = GetThirdGraphType(metaTable, columnMetadata, queryThirdArguments); objectGraphType.AddField(new FieldType { Name = $"{columnMetadata.ColumnName}", ResolvedType = tableType, Arguments = queryThirdArguments }); } else if (columnMetadata.Type == typeof(Point) || columnMetadata.Type == typeof(Coordinate) || columnMetadata.Type == typeof(LineString) || columnMetadata.Type == typeof(Polygon) || columnMetadata.Type == typeof(MultiLineString)) { objectGraphType.AddField( new FieldType { Type = typeof(string).GetGraphTypeFromType(true), Name = columnMetadata.ColumnName, Resolver = new PointResolver(parentType, columnMetadata.ColumnName) } ); FillArguments(queryArguments, columnMetadata.ColumnName, columnMetadata.Type); } else if (columnMetadata.Type == typeof(TimeSpan)) { objectGraphType.AddField( new FieldType { Type = typeof(string).GetGraphTypeFromType(true), Name = columnMetadata.ColumnName, Resolver = new TimeSpanResolver(parentType, columnMetadata.ColumnName) } ); FillArguments(queryArguments, columnMetadata.ColumnName, columnMetadata.Type); } else { objectGraphType.Field( GraphUtils.ResolveGraphType(columnMetadata.Type), columnMetadata.ColumnName ); FillArguments(queryArguments, columnMetadata.ColumnName, columnMetadata.Type); if (columnMetadata.Type.IsEnum) { FillArguments(queryArguments, $"{columnMetadata.ColumnName}_enum", typeof(int)); objectGraphType.AddField( new FieldType { Type = typeof(int).GetGraphTypeFromType(true), Name = $"{columnMetadata.ColumnName}_value", Resolver = new EnumResolver(parentType, columnMetadata.ColumnName) } ); } } }
//protected override IEnumerable<ICatalog> GetCatalogs() //{ // if (catalog == null) // { // catalog = this.InitializeCatalog(); // } // return new List<ICatalog>() {catalog}; //} ICatalog InitializeCatalog() { ICatalog catalog = new Catalog(this); catalog.CatalogName = "WikipediaData"; //catalog.ConnectionString = ConnectionString; catalog.ConnectionType = ConnectionTypes.S3; catalog.CatalogMetadata = new CatalogMetadata(catalog); ITableMetadata tableMetadata = new TableMetadata(catalog.CatalogMetadata); tableMetadata.DataType = typeof(WikipediaHourlyPageStats); tableMetadata.ModField = "PrimaryKey"; tableMetadata.PrimaryKey = "PrimaryKey"; tableMetadata.ReferenceTable = false; tableMetadata.SaturationFrequency = 30000; tableMetadata.SaturationPurgeField = "RecordedOn"; tableMetadata.SaturationPurgeOperation = PurgeOperations.PURGE_OP_SMALLEST; tableMetadata.SaturationPurgePercent = 5; tableMetadata.SaturationPurgeType = typeof(DateTime); tableMetadata.SaturationUpdateField = "RecordedOn"; tableMetadata.SaturationUpdateComparator = Comparators.GREATER_THAN_EQUAL_TO; tableMetadata.SaturationUpdateType = typeof(DateTime); tableMetadata.TableName = "PageStats"; ColumnMetadata col; col = new ColumnMetadata(tableMetadata) { ColumnName = "Id", ColumnType = typeof(Int64), FieldMapping = "PrimaryKey", Nullable = false, ColumnLength = 0, ColumnPrecision = 0, Visible = true }; tableMetadata.ColumnsMetadata.Add(col.ColumnName, col); col = new ColumnMetadata(tableMetadata) { ColumnName = "RecordedOn", ColumnType = typeof(DateTime), FieldMapping = "RecordedOn", Nullable = false, ColumnLength = 0, ColumnPrecision = 0, Visible = true }; tableMetadata.ColumnsMetadata.Add(col.ColumnName, col); col = new ColumnMetadata(tableMetadata) { ColumnName = "ProjectCode", ColumnType = typeof(string), FieldMapping = "ProjectCode", Nullable = false, ColumnLength = 0, ColumnPrecision = 0, Visible = true }; tableMetadata.ColumnsMetadata.Add(col.ColumnName, col); col = new ColumnMetadata(tableMetadata) { ColumnName = "PageName", ColumnType = typeof(string), FieldMapping = "PageName", Nullable = false, ColumnLength = 0, ColumnPrecision = 0, Visible = true }; tableMetadata.ColumnsMetadata.Add(col.ColumnName, col); col = new ColumnMetadata(tableMetadata) { ColumnName = "PageViews", ColumnType = typeof(Int32), FieldMapping = "PageViews", Nullable = false, ColumnLength = 0, ColumnPrecision = 0, Visible = true }; tableMetadata.ColumnsMetadata.Add(col.ColumnName, col); col = new ColumnMetadata(tableMetadata) { ColumnName = "PageSizeKB", ColumnType = typeof(Int32), FieldMapping = "PageSizeKB", Nullable = false, ColumnLength = 0, ColumnPrecision = 0, Visible = true }; tableMetadata.ColumnsMetadata.Add(col.ColumnName, col); catalog.CatalogMetadata.Tables.Add(tableMetadata.TableName, tableMetadata); return(catalog); }
private dynamic GetFourthGraphType(TableMetadata metaTable, ColumnMetadata columnMetadata, QueryArguments queryArguments, bool isList = false) { string key = $"Fourth_{columnMetadata.Type.Name}"; dynamic objectGraphInternal = null; dynamic listGraphType = null; if ((isList && !_tableNameLookup.ExistListGraphType(key + "_list")) || (!isList && !_tableNameLookup.ExistGraphType(key))) { var inherateType = typeof(ObjectGraphType <>).MakeGenericType(new Type[] { metaTable.Type }); objectGraphInternal = Activator.CreateInstance(inherateType); objectGraphInternal.Name = key; if (isList) { var inherateListType = typeof(ListGraphType <>).MakeGenericType(new Type[] { objectGraphInternal.GetType() }); listGraphType = Activator.CreateInstance(inherateListType); listGraphType.ResolvedType = objectGraphInternal; } foreach (var tableColumn in metaTable.Columns) { if (tableColumn.Type == typeof(TimeSpan)) { objectGraphInternal.AddField( new FieldType { Type = typeof(string).GetGraphTypeFromType(true), Name = tableColumn.ColumnName, Resolver = new TimeSpanResolver(metaTable.Type, tableColumn.ColumnName) } ); FillArguments(queryArguments, tableColumn.ColumnName, tableColumn.Type); } else { objectGraphInternal.Field( GraphUtils.ResolveGraphType(tableColumn.Type), tableColumn.ColumnName ); FillArguments(queryArguments, tableColumn.ColumnName, tableColumn.Type); if (tableColumn.Type.IsEnum) { FillArguments(queryArguments, $"{tableColumn.ColumnName}_enum", typeof(int)); objectGraphInternal.AddField( new FieldType { Type = typeof(int).GetGraphTypeFromType(true), Name = $"{tableColumn.ColumnName}_value", Resolver = new EnumResolver(metaTable.Type, tableColumn.ColumnName) } ); } } } } else { foreach (var tableColumn in metaTable.Columns) { FillArguments(queryArguments, tableColumn.ColumnName, tableColumn.Type); } } if (isList) { return(_tableNameLookup.GetOrInsertListGraphType(key + "_list", listGraphType)); } return(_tableNameLookup.GetOrInsertGraphType(key, objectGraphInternal)); }
public virtual string GetText(ColumnMetadata metadata) => GetText(metadata.Role, metadata.Type, metadata.Tolerance, metadata.Rounding);
public void RenderMessage_FullSamples_Correct() { var referenceTable = new DataTable() { TableName = "MyTable" }; referenceTable.Columns.Add(new DataColumn("ForeignKey")); referenceTable.Columns.Add(new DataColumn("Numeric value")); referenceTable.LoadDataRow(new object[] { "Alpha", 15 }, false); referenceTable.LoadDataRow(new object[] { "Beta", 20 }, false); referenceTable.LoadDataRow(new object[] { "Delta", 30 }, false); referenceTable.LoadDataRow(new object[] { "Epsilon", 40 }, false); var candidateTable = new DataTable() { TableName = "MyTable" }; candidateTable.Columns.Add(new DataColumn("ForeignKey")); candidateTable.Columns.Add(new DataColumn("Numeric value")); candidateTable.Columns.Add(new DataColumn("Boolean value")); candidateTable.LoadDataRow(new object[] { "Alpha", 10, true }, false); candidateTable.LoadDataRow(new object[] { "Gamma", 20, false }, false); var foreignKeyDefinition = new ColumnMetadata() { Identifier = new ColumnIdentifierFactory().Instantiate("ForeignKey"), Role = ColumnRole.Key }; var numericDefinition = new ColumnMetadata() { Identifier = new ColumnIdentifierFactory().Instantiate("Numeric value"), Role = ColumnRole.Value }; var keyMappings = new ColumnMappingCollection() { new ColumnMapping(foreignKeyDefinition.Identifier, ColumnType.Text) }; var valueMappings = new ColumnMappingCollection() { new ColumnMapping(numericDefinition.Identifier, ColumnType.Numeric) }; var violations = new LookupExistsViolationCollection(keyMappings); violations.Register(new KeyCollection(new[] { "Gamma" }), candidateTable.Rows[1]); var samplers = new Dictionary <string, ISampler <DataRow> >() { { "candidate", new FullSampler <DataRow>() }, { "reference", new FullSampler <DataRow>() }, { "analysis", new FullSampler <DataRow>() }, }; var message = new LookupReverseExistsViolationMessageJson(samplers); message.Generate(referenceTable.Rows.Cast <DataRow>(), candidateTable.Rows.Cast <DataRow>(), violations, keyMappings, valueMappings); var text = message.RenderMessage(); Console.WriteLine(text); Assert.That(text, Is.StringContaining("\"expected\":{\"total-rows\":4,\"table\"")); Assert.That(text, Is.StringContaining("\"actual\":{\"total-rows\":2,\"table\"")); Assert.That(text, Is.StringContaining("\"analysis\":{\"missing\":{\"total-rows\":1,")); Assert.That(text, Is.StringContaining("[[\"Gamma\",\"20\",\"False\"]]")); }
public void RenderMessage_FullSamples_Correct() { var referenceTable = new DataTable() { TableName = "MyTable" }; referenceTable.Columns.Add(new DataColumn("ForeignKey")); referenceTable.Columns.Add(new DataColumn("Numeric value")); referenceTable.LoadDataRow(new object[] { "Alpha", 15 }, false); referenceTable.LoadDataRow(new object[] { "Beta", 20 }, false); referenceTable.LoadDataRow(new object[] { "Delta", 30 }, false); var candidateTable = new DataTable() { TableName = "MyTable" }; candidateTable.Columns.Add(new DataColumn("ForeignKey")); candidateTable.Columns.Add(new DataColumn("Numeric value")); candidateTable.Columns.Add(new DataColumn("Boolean value")); candidateTable.LoadDataRow(new object[] { "Alpha", 10, true }, false); candidateTable.LoadDataRow(new object[] { "Beta", 20, false }, false); var foreignKeyDefinition = new ColumnMetadata() { Identifier = new ColumnIdentifierFactory().Instantiate("ForeignKey"), Role = ColumnRole.Key }; var numericDefinition = new ColumnMetadata() { Identifier = new ColumnIdentifierFactory().Instantiate("Numeric value"), Role = ColumnRole.Value }; var keyMappings = new ColumnMappingCollection() { new ColumnMapping(foreignKeyDefinition.Identifier, ColumnType.Text) }; var valueMappings = new ColumnMappingCollection() { new ColumnMapping(numericDefinition.Identifier, ColumnType.Numeric) }; var information = new LookupMatchesViolationInformation(RowViolationState.Mismatch); information.AddCandidateRow(candidateTable.Rows[0]); information.CandidateRows.ElementAt(0).Records.Add(new LookupMatchesViolationRecord() { { candidateTable.Columns[1], new LookupMatchesViolationData(false, 15) }, }); var violations = new LookupMatchesViolationCollection(keyMappings, valueMappings) { { new KeyCollection(new[] { "Alpha" }), information } }; var samplers = new Dictionary <string, ISampler <DataRow> >() { { "candidate", new FullSampler <DataRow>() }, { "reference", new FullSampler <DataRow>() }, { "analysis", new FullSampler <DataRow>() }, }; var message = new LookupMatchesViolationMessageJson(samplers); message.Generate(referenceTable.Rows.Cast <DataRow>(), candidateTable.Rows.Cast <DataRow>(), violations, keyMappings, valueMappings); var text = message.RenderMessage(); Console.WriteLine(text); Assert.That(text, Is.StringContaining("\"expected\":{\"total-rows\":3,\"table\"")); Assert.That(text, Is.StringContaining("\"actual\":{\"total-rows\":2,\"table\"")); Assert.That(text, Is.StringContaining("\"analysis\":{\"non-matching\":{\"total-rows\":1,")); Assert.That(text, Is.StringContaining(",{\"value\":\"10\",\"expectation\":\"15\"},")); }