Как присвоить пустое значение в конструкции с помощью класса Update
var accountUpdate = new Update(UserConnection, "Account")
.Set("IndustryId", Column.Parameter(IndustryIdParameter))
.Where("Id").IsEqual(Column.Const(AccountIdParameter)).Execute()
Если есть такой запрос и значение параметра IndustryIdParameter равно null, то выдаст ошибку так как в базу пойдет запрос не со значением null, a c Guid.Empty.
Каким образом можно решить эту задачу?
И ещё интересует возможно ли использование в этой конструкции сложных условий в Where, речь идет о запросе вида:
update Account
set
IndustryId = @P4
where CountryId = @P1
and (IndustryId = @P2
or IndustryId = @P3)
Нравится
Лучше использовать конструкцию .OpenBlock() пример ниже:
Select select = (Select)new Select(UserConnection) .Column("Id") .Column("AccountAId") .Column("AccountBId") .From("Relationship") .Where() .OpenBlock() .OpenBlock("AccountAId").IsEqual(Column.Parameter(accountId)) .And("AccountBId").IsEqual(Column.Parameter(searchParentId)) .CloseBlock() .Or() .OpenBlock("AccountAId").IsEqual(Column.Parameter(searchParentId)) .And("AccountBId").IsEqual(Column.Parameter(accountId)) .CloseBlock() .And() .OpenBlock("RelationTypeId").IsEqual(Column.Parameter(relationTypeId)) .Or("ReverseRelationTypeId").IsEqual(Column.Parameter(relationTypeId)) .CloseBlock(); .CloseBlock();
if (IndustryIdParameter != Guid.Empty) { var accountUpdate = new Update(UserConnection, "Account") .Set("IndustryId", Column.Parameter(IndustryIdParameter)) .Where("Id").IsEqual(Column.Const(AccountIdParameter)).Execute() }
А для конструкции получается просто
var accountUpdate = new Update(UserConnection, "Account") .Set("IndustryId", Column.Parameter(IndustryIdParameter)) .Where("CountryId").IsEqual(Column.Parameter(CountryParameter)) .And("IndustryId").IsEqual(Column.Parameter(IndustryIdParameter1)) .Or("IndustryId").IsEqual(Column.Parameter(IndustryIdParameter2));
new Update(UserConnection, "ActivityCorrespondence") .Set("ActivityId", Column.Const(null)) .Where("ActivityId").IsEqual(Column.Parameter(activityId)) .Execute(dbExecutor);
Литвинко Павел,
Ага, а если нужно проверить 5 параметров, то в пору делать switch с перебором всех возможных комбинаций.
Лучше использовать конструкцию .OpenBlock() пример ниже:
Select select = (Select)new Select(UserConnection) .Column("Id") .Column("AccountAId") .Column("AccountBId") .From("Relationship") .Where() .OpenBlock() .OpenBlock("AccountAId").IsEqual(Column.Parameter(accountId)) .And("AccountBId").IsEqual(Column.Parameter(searchParentId)) .CloseBlock() .Or() .OpenBlock("AccountAId").IsEqual(Column.Parameter(searchParentId)) .And("AccountBId").IsEqual(Column.Parameter(accountId)) .CloseBlock() .And() .OpenBlock("RelationTypeId").IsEqual(Column.Parameter(relationTypeId)) .Or("ReverseRelationTypeId").IsEqual(Column.Parameter(relationTypeId)) .CloseBlock(); .CloseBlock();
Литвинко Павел,
В том то и дело, что такой способ мне известен, но перебирать нужно 3 разные комбинации и в итоге, вместо кода на один абзац, получается аж на страницу!
Интересует возможность прямо в Update запилить эту проверку.
Зверев Александр,
Саша, такой вариант понятен. Но мне нужно сразу преобразовать пустой параметр в null, чтобы вместо нескольких практически аналогичных запросов использовать один.
К тому же, для наглядности приведен достаточно тривиальный пример. В реальности таких полей с пустым значением может быть несколько в разных комбинациях.
Алла, что не так в написании в нужном месте одного и того же текста «Column.Const(null)»? Если не знаешь, будет там null или значение, можно написать в С# в месте формирования Update блок if(){}else{} и проверять значение переменной. Update можно формировать по частям, дописывая к нему строки от начала к концу. И запускать, когда готов.
Алла Савельева,
Тогда делайте через тернарный оператор "?" и получите то же условие но в одну строку
Литвинко Павел,
Пожалуйста, расскажите подробнее на моем примере.
Алла Савельева,
Примерно так:
var accountUpdate = new Update(UserConnection, "Account") .Set("IndustryId", Column.Const(IndustryIdParameter != Guid.Empty ? IndustryIdParameter.ToString() : null)) .Where("Id").IsEqual(Column.Const(AccountIdParameter)).Execute()
Алла, примерно:
.Set("IndustryId", ((IndustryIdParameter!=Guid.Empty)?Column.Parameter(IndustryIdParameter):Column.Const(null)))
А еще лучше будет расширить метод Set, чтобы сразу проверять на Guid.Empty
public static Update Set(this Update update, string column, Guid value) { return value == Guid.Empty ? update.Set(column, Column.Parameter(null)) : update.Set(column, Column.Parameter(value)); }
И весь вызов станет еще компактнее
.Set("IndustryId", YourGuid);
Григорий Чех пишет:
Литвинко Павел,
Точно! Поправил, спасибо)