Вопрос

Сериализация расширенного фильтра на C#

Доброго времени суток.

Имеется некий расширенный фильтр на странице записи. Сохраняется в виде JSONa в колонку таблицы.

Изображение удалено.

Чтобы использовать этот фильтр в запросах имеется специальный класс, который десериализует строку в коллекцию фильтров для EntitySchemaQuery.

var constructorArgument = new ConstructorArgument("userConnection", userConnection);
var filterConverter = ClassFactory.Get<IProcessDataContractFilterConverter>(constructorArgument);
IEntitySchemaQueryFilterItem filterCollection = filterConverter.ConvertToEntitySchemaQueryFilterItem(esq, filterValue);
 
esq.Filters.Add(filterCollection);

где filterValue - это тот самый расширенный фильтр.

 

При этом я не наблюдаю обратного механизма сериализации коллекции фильтров в формат, понятный для модуля расширенных фильтров на клиентской части. Как правильно сохранить коллекцию фильтров в базе?

 

Пока единственный рабочий вариант что приходит в голову - составлять его из частей заранее заготовленных строк.

Нравится

1 комментарий

Добрый день, Михаил!

Действительно, в классе ProcessDataContractFilterConverter нет подходящего метода для сериализации. Там есть метод GetActivityFinalStatusFilter, который возвращает уже сигнализированную строку фильтров для активности, однако, он не то, что нужно в этой ситуации. 

Рекомендую ознакомится с примеров https://academy.terrasoft.ua/docs/developer/integrations_and_api/data_s…, а именно "Пример реализации класса коллекции фильтров".

Помимо этого прикладываю другой пример сериализации фильтров в c# коде.

string serializedFilters = Json.Serialize(new Filters {
				FilterType = FilterType.CompareFilter,
				ComparisonType = FilterComparisonType.Equal,
				LeftExpression = new ColumnExpression {
					ColumnPath = "testColumn"
				},
				RightExpression = new BaseExpression {
					ExpressionType = EntitySchemaQueryExpressionType.Parameter,
					Parameter = new Parameter {
						Value = expectedFilterValue,
						DataValueType = DataValueType.Guid
					}
				}
			});

 

Показать все комментарии