Добрый день, коллеги!
Имеется примерно такой запрос:
.Column("Table1", "Column1").As("Column1")
.From("Table1").As("Table1")
.Where("Table1", "Column2").IsNotEqual( ... ) as Select;
И имеется некоторая коллекция значений, к примеру:
Вопрос в следующем: Каким образом можно в условие запроса передать список значений моей коллекции (будь то Array, ArrayList, List, Dictionary, Hashtable, SortedList или другое - значения не имеет)?
Условно говоря, мне нужно мою коллекцию представить в виде типа "Select", чтобы можно было использовать в месте отмеченном 3-мя точками, - это если следовать сигнатуре этих методов, согласно описанию из SDK (www.terrasoft.ru/bpmonlinesdk/). Но как это сделать? Прошу помощи!
Нравится
Виталий, для этого нужно использовать конструкцию .Not().In(массив_или_список_идентификаторов) .
Пример использования (схема EditSynchUserInSynchRole):
var ldapGroupsIds = new List<QueryParameter>(); var ldapUserLoginAttribute = SysSettings.GetValue(UserConnection, "LDAPUserLoginAttribute").ToString(); using (var ldapUtils = new LdapUtilities(UserConnection)) { var usersCollection = ldapUtils.GetUsersAttributesByFilter(ldapUserLoginAttribute + "=" + ldapEntry, new [] {"distinguishedName"}); var userDn = string.Empty; foreach (SearchResultEntry user in usersCollection) { userDn = user.DistinguishedName; break; } var ldapGroupIdentityAttribute = SysSettings.GetValue(UserConnection, "LDAPGroupIdentityAttribute").ToString(); var groupsCollection = ldapUtils.GetGroupsAttributesByFilter("member=" + userDn, new [] {ldapGroupIdentityAttribute}); foreach(SearchResultEntry group in groupsCollection) { ldapGroupsIds.Add(new QueryParameter(ldapUtils.IdentityAttributeToString(group.Attributes[ldapGroupIdentityAttribute][0]))); } } if (ldapGroupsIds.Count < 1) { return true; } var delete = new Delete(UserConnection).From("SysUserInRole"). Where("SysUserId").IsEqual(Column.Parameter(userId)). And().Exists(new Select(UserConnection). Column("Id").From("SysAdminUnit"). Where("SysUserInRole", "SysRoleId").IsEqual("SysAdminUnit", "Id"). And("SynchronizeWithLDAP").IsEqual(Column.Parameter(true)). And("LDAPEntryId").Not().In(ldapGroupsIds)); delete.Execute();
Если же передавать массив, то так (схема AdministrativeGrantedRightsGridPage):
object[] objectParameters = new object[adminUnitCollection.Count]; for (int i = 0; i < adminUnitCollection.Count; i++) { objectParameters[i] = adminUnitCollection[i]; } } var entitySchemaManager = Page.UserConnection.EntitySchemaManager; var rightsSchema = entitySchemaManager.GetInstanceByName("SysAdminUnitGrantedRight"); var select = new Select(Page.UserConnection) .Column(rightsSchema.Name, "Id") .Column(rightsSchema.Name, "GrantorSysAdminUnitId") .Column("Grantor", "Name").As("GrantorSysAdminUnitName") .From(rightsSchema.Name) .InnerJoin("SysAdminUnit").As("Grantor").On("Grantor", "Id").IsEqual(rightsSchema.Name, "GrantorSysAdminUnitId") .Where(rightsSchema.Name, "GranteeSysAdminUnitId").In(Column.Parameters(objectParameters)) .OrderByAsc("Grantor", "Name") as Select;
Хм... Честно говоря, если судить по информации из SDK (http://i.piccy.info/i9/fa961117bdc660b65920ae24393d4c3e/1452507140/1535…), то оператор "In()" не принимает произвольную коллекцию, потому и решил переспросить. Во всяком случае, вопрос закрыт. В очередной раз спасибо Вам, Александр!
Я тоже думал, что только массивы из Object, но оказалось, что не только массивы.
В первом примере обратите внимание, что коллекция из элементов именно типа QueryParameter.
А это действительно важно, использовать именно тип "QueryParameter"? Т.е., к примеру:
List<Guid> guids = new List<Guid>();
нельзя использовать? Или тот же тип "string"? В том же SDK есть только такой пример: http://i.piccy.info/i9/7c65675471d92405256ab8d1e300693f/1452512386/1789…
Если следовать этому описанию, то коллекция ГУИДов должна выглядеть так:
List<QueryParameter> guids = new List<QueryParameter>(); guids.Add(new QueryParameter((new Guid("...")).ToString()))
Верно ли это? Тогда я не смогу указать оператор "In()" для колонки, содержащую тип "Guid", т.к. я буду проверять наличие текущей записи в коллекции guids, а у нее QueryParameter содержит тип "string". Что-то тут нечисто... Подскажете, как быть?:confused:
Попробуйте сделать как в моём первом примере, там как раз сравнивается со списком из Guid, хоть и приводится к строке.