«Центр Разработки и Внедрения Террасофт Поволжье» Примеры применения LINQ в BPM’Online Содержание Фильтрация Группировка Соединение Фильтрация Запрос ESQ var entitySchemaManager = UserConnection.GetSchemaManager("EntitySchemaManager") as EntitySchemaManager; var contactESQ = new EntitySchemaQuery(entitySchemaManager, "Contact"); contactESQ.JoinRightState = Core.DB.QueryJoinRightLevel.Disabled; contactESQ.AddAllSchemaColumns(); EntityCollection entities = contactESQ.GetEntityCollection(UserConnection); SELECT * FROM [Contact] Ну, например… • Получим, сколько записей, у которых поле «FirstName» равно «Анна» int count = (from elems in entities where elems.GetTypedColumnValue<string>("FirstName") == "Анна" select elems).Count(); Группировка Группировка • Используем тот же самый запрос ESQ и сгруппируем полученные записи по полю «FirstName», примерно так: Key: FirstName1 Key: FirstName2 Key: FirstName3 Group1 Group2 Group3 LINQ-запрос var groupedQuery = from elems in entities group elems by elems.GetTypedColumnValue<string>("FirstName") into groupedEntities select groupedEntities; //Выведем результат запроса: foreach (var group in groupedQuery) { Log(group.Key); foreach (var entity in group) { Log(string.Format(" {0}", entity.GetTypedColumnValue<string>("Surname"))); } } Результат Наталья Маркелова Нестеренко Макеева ... Марина Иванова Сироткина Петрова ... Мария Хохлова Шевченко Воробьева ... Соединение Запрос ESQ var entitySchemaManager = UserConnection.GetSchemaManager("EntitySchemaManager") as EntitySchemaManager; var contactESQ = new EntitySchemaQuery(entitySchemaManager, "Contact"); contactESQ.JoinRightState = Core.DB.QueryJoinRightLevel.Disabled; contactESQ.AddAllSchemaColumns(); EntityCollection contactEntities = contactESQ.GetEntityCollection(UserConnection); var accountESQ = new EntitySchemaQuery(entitySchemaManager, "Account"); accountESQ.JoinRightState = Core.DB.QueryJoinRightLevel.Disabled; accountESQ.AddAllSchemaColumns(); EntityCollection accountEntities = accountESQ.GetEntityCollection(UserConnection); SELECT * FROM [Contact] SELECT * FROM [Account] Ну, например… • Получим только те контакты, у которых указан контрагент SELECT * FROM [Contact] INNER JOIN [Account] ON [Contact].[AccountId] = [Account].[Id] LINQ-запрос var innerJoinQuery = from contacts in contactEntities join acc in accountEntities on contacts.GetTypedColumnValue<Guid>("AccountId") equals acc.GetTypedColumnValue<Guid>("Id") select new { ContactName = contacts.GetTypedColumnValue<string>("Name"), AccountName = acc.GetTypedColumnValue<string>("Name") }; //Выведем результат: foreach(var element in innerJoinQuery) { Log(string.Format("{0} : {1}", element.ContactName, element.AccountName)); } Supervisor : СибАкадемСтрой Недвижимость Тестов Тест Тестович : Ваш Академгородок Васильковский Александр : Большой Город Пупкин : Вектор Решетинский Николай Валерьевич : СибАкадемСтрой Недвижимость Плавко Надежда Владимировна : СибАкадемСтрой Недвижимость Васильковский Александр : Большой Город Solovey Aleksandr : СибАкадемСтрой Недвижимость Любимова Оксана Михайловна : СибАкадемСтрой Недвижимость ... Россия: 443035 Самара, Московское шоссе 4а +7 (846) 266-55-69 info@terrasoft.ru 123090, Москва, Ул. Каланчевская, д. 16 +7 (495) 280-16-80 info@terrasoft.ru Украина: 03118, Киев, пр-т. Краснозвездный, 115-А +38 (044) 363-31-33 info@terrasoft.ua UK: PORTLAND HOUSE, BRESSENDAN PLACE, LONDON SW1E 5RS +44 (2) 0338 40040 info@tscrm.com Alexandria: 901 N Pitt Street, Suite 325 Alexandria +1 (917) 383-27-70 info@bpmonline.com