Не могу сделать выборку по внешнему ключу

Добрый день, необходимо написать веб сервис на 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, я этого не знал.

 

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