Добрый день, необходимо написать веб сервис на c# и столкнулся с проблемой.

В таблице есть колонка UsrdDislocationId которая ссылается на другую таблицу. у меня есть айди по котрому надо найти запись. на данный момент я написал такой запрос.

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

но при этом я получаю ошибку 

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

если програмно сделать запрос вида 

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

то я получаю такой ответ

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

то есть колонка вроде как есть.

 

в чем может быть проблема? 

 

спасибо!

Нравится

4 комментария
Лучший ответ

1. При работе с ESQ/Entity (в отличие от Select/Insert и т.п.), в фильтрах названия колонок типа справочник указываются без окончания "Id".

2. FetchFromDB, помимо того, что возвращает true/false в зависимости от того, найдена запись в БД или нет, еще и вытягивает все колонки сущности, что является избыточным для простой проверки наличия записи в таблице. 

Лучше тогда уж использовать что-то в этом роде:

var select = (Select) new Select(UserConnection)
    .Column(Func.Count(Column.Asterisk()))
    .From("UsrAdressInCase")
    .Where("UsrdDislocationId").IsEqual(Column.Parameter(usrLookup1));
 
bool exists = select.ExecuteScalar<int>() > 0;

P.S.: 

var exists = contact.FetchFromDB("MobilePhone", phone); - здесь тоже затягивается куча избыточной информации.

Добрый день,

 

Не подскажите, пожалуйста, что именно вы передаете в параметре usrlookup1? Можете также поделиться частью кода там, где мы берем его значение?

 

С уважением,

Дарий

Добрый вечер.

usrLookup1 это Guid.

вот полный код

 

var contactSchema = UserConnection.EntitySchemaManager.FindInstanceByName("Contact");
var contact = contactSchema.CreateEntity(UserConnection);
var exists = contact.FetchFromDB("MobilePhone", phone);
 
if (!exists)
{
    return "1";
}
 
var usrLookup1 = (Guid)contact.GetColumnValue("UsrLookup1Id");
if (usrLookup1 == Guid.Empty)
{
    return "2";
}
 
var usrAddressSchema = UserConnection.EntitySchemaManager.FindInstanceByName("UsrAdressInCase");
 
//return string.Join(",", usrAddressSchema.Columns.Select(c => c.ColumnValueName));
var usrAdressInContact = usrAddressSchema.CreateEntity(UserConnection);
exists = usrAdressInContact.FetchFromDB("UsrdDislocationId", usrLookup1);
 
if (!exists)
{
    return "3";
}

если расскомментировать строку string.Join.... тогда получаю тот результат что выше.

я так же проверял какие колонки находятся в самой БД с помощью SQL запросов и там тоже есть UsrdDislocationId.

1. При работе с ESQ/Entity (в отличие от Select/Insert и т.п.), в фильтрах названия колонок типа справочник указываются без окончания "Id".

2. FetchFromDB, помимо того, что возвращает true/false в зависимости от того, найдена запись в БД или нет, еще и вытягивает все колонки сущности, что является избыточным для простой проверки наличия записи в таблице. 

Лучше тогда уж использовать что-то в этом роде:

var select = (Select) new Select(UserConnection)
    .Column(Func.Count(Column.Asterisk()))
    .From("UsrAdressInCase")
    .Where("UsrdDislocationId").IsEqual(Column.Parameter(usrLookup1));
 
bool exists = select.ExecuteScalar<int>() > 0;

P.S.: 

var exists = contact.FetchFromDB("MobilePhone", phone); - здесь тоже затягивается куча избыточной информации.

Спасибо за ответ.

Некоторые поля мне необходимы в дальнейшем, это был только кусок кода.

Спасибо за замечание №1, я этого не знал.

 

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

Добрый день. Вопрос - можно ли добавить несколько фильтров                 accountEsq.Filters.LogicalOperation = LogicalOperationStrict.Or;

var accountIdNumberEsqFilter = accountEsq.CreateFilterWithParameters(FilterComparisonType.Equal, "PsIdNumber", request.IdNumber);

var accountIdFixEsqFilter = accountEsq.CreateFilterWithParameters(FilterComparisonType.Equal, "PsIdFix", request.IdNumber);

var accountServiceCrmIdEsqFilter = accountEsq.CreateFilterWithParameters(FilterComparisonType.Equal, "PsServiceCrmId", request.IdNumber);

accountEsq.Filters.Add(accountIdNumberEsqFilter);

accountEsq.Filters.Add(accountIdFixEsqFilter);

accountEsq.Filters.Add(accountServiceCrmIdEsqFilter);

в

CreateEntity(UserConnection)

так как в

UserConnection.EntitySchemaManager.GetInstanceByName,

или только использовать FetchFromDB ?

Нравится

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

Функция CreateEntity создаёт новую запись с пустыми полями, фильтры тут не имеют смысла:

var contactCareerSchema = UserConnection.EntitySchemaManager.GetInstanceByName("ContactCareer");	
var contactCareerEntity = contactCareerSchema.CreateEntity(UserConnection);
contactCareerEntity.SetDefColumnValues();
contactCareerEntity.SetColumnValue("Id", Guid.NewGuid());
contactCareerEntity.SetColumnValue("ContactId", NewMainContact);
contactCareerEntity.SetColumnValue("AccountId", EntityPrimaryColumnValue);
contactCareerEntity.SetColumnValue("Current", true);
contactCareerEntity.Save();

Другой её способ использования вместе с FetchFromDB, вытягивание записи по Id:

var schema = UserConnection.EntitySchemaManager.FindInstanceByName("SysAdminUnit");
var sysAdminUnit = schema.CreateEntity(UserConnection);
if (sysAdminUnit.FetchFromDB(recordId)) {
	var p = new Dictionary<string, string>();
	p.Add("LDAPEntryId", sysAdminUnit.GetTypedColumnValue<string>("LDAPEntryId"));
...

Наконец, вытягивать можно не только по Id, но и по другим условиям, как тут:

Dictionary<string, object> conditions = new Dictionary<string, object>();
var userId = (context.ThrowEventArgs as List<object>)[0].ToString();
var roleId = new Guid("A29A3BA5-4B0D-DE11-9A51-005056C00008");
conditions["SysUser"] = userId;
var sysUserInRoleSchema = Page.UserConnection.EntitySchemaManager.GetInstanceByName("SysUserInRole");
conditions["SysRole"] = roleId;
var sysUserInRole = sysUserInRoleSchema.CreateEntity(Page.UserConnection);
if (sysUserInRole.FetchFromDB(conditions)) {
	return true;
}

Возможно, Вам нужно сделать похожее на последний вариант. Но если из-за Or условие слишком сложное, проще будет использовать обычное получение коллекции после наложения фильтров:

var couponESQ = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Coupon");
	couponESQ.AddColumn("BonusesPayedAmount");
	couponESQ.AddColumn("CouponCard");
couponESQ.Filters.Add(couponESQ.CreateFilterWithParameters(FilterComparisonType.Equal, "Purchase", purchaseId));
var cardFilters = new EntitySchemaQueryFilterCollection(couponESQ, LogicalOperationStrict.Or);
var permanentCardIdfilter = couponESQ.CreateFilterWithParameters(FilterComparisonType.Equal, "CouponCard.Type", Terrasoft.Configuration.CardConsts.PermanentTypeUId);
cardFilters.Add(permanentCardIdfilter);
var temporaryCardIdfilter = couponESQ.CreateFilterWithParameters(FilterComparisonType.Equal, "CouponCard.Type", Terrasoft.Configuration.CardConsts.TemporaryTypeUId);
cardFilters.Add(temporaryCardIdfilter);
var certificateCardIdfilter = couponESQ.CreateFilterWithParameters(FilterComparisonType.Equal, "CouponCard.Type", Terrasoft.Configuration.CardConsts.SertificateTypeUId);
cardFilters.Add(certificateCardIdfilter);
couponESQ.Filters.Add(cardFilters);
var couponEntities = couponESQ.GetEntityCollection(UserConnection);
if (couponEntities.Count > 0) {
	foreach (var coupon in couponEntities) {
		var bonusesPayedAmount = coupon.GetTypedColumnValue<decimal>("BonusesPayedAmount");
...

 

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

Здравствуйте!

Подскажите, как можно осуществить проверку наличия таблиц и их колонок БД по именам, используя EntitySchemaManager в веб-сервисе? Чтобы проверить перед внесением изменений в БД.

Нравится

2 комментария

В Terrasoft 3.Х нет механизма EntitySchemaManager. Там всё устроено иначе.

"Зверев Александр" написал:

В Terrasoft 3.Х нет механизма EntitySchemaManager. Там всё устроено иначе.


Понял. Спасибо.

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