Страницы

Поиск по вопросам

воскресенье, 1 марта 2020 г.

Linq удалить диапазон по id

#c_sharp #entity_framework #linq


Как написать запрос удаления диапазона по списку id, без создания сущностей которые
требуются в RemoveRange?
    


Ответы

Ответ 1



Если работаете с БД через Энтити, то мое решение не подойдет. Давайте вдарим по функциональщине - не будем удалять ничего из исходной коллекции, а просто заместим ее новой коллекцией без ненужных элементов: var range = new List {1, 2, 3, 3, 4, 5, 6, 78, 8}; //идэшники которые нужно удалить //коллекция из которой будем удалять, если вы под id имели в виду индекс элемента var collection = Enumerable.Range(0, 100).ToList(); //здесь мы просто создаем коллекцию, у вас она уже есть collection = collection.Where((x,i)=> !range.Contains(i)).ToList(); //а вот самая мякотка здесь //в случае если id - это поле некоторого объекта коллекции которую //мы хотим почистить var collection2 = Enumerable.Range(0, 100) .Select(x=> new {Id = x, Value=x*10}) .ToList(); // то будет так: collection2 = collection2.Where(x => !range.Contains(x.Id)).ToList(); В случае Entity Framework вроде иного способа нет: db.SomeTable.RemoveRange(db.SomeTable.Where(r => IDs.Contains(r.ID))); По идеи объекты в параметрах не создаются - просто все дерево транслируется в SQL - так что не надо беспокоится на этот счет.

Ответ 2



Решил вопрос таким образом (через фейковые объекты): public async Task DeleteUsersByIdAsync(IEnumerable id_users) { using (REMOTE_OFFICE_3Entities db = new REMOTE_OFFICE_3Entities()) { IEnumerable delete_users = id_users .Select(selector: id => new User { id = id }) .Select(selector: read => db.Users.Attach(entity: read)); db.Users.RemoveRange(entities: delete_users); await db.SaveChangesAsync(); } }

Комментариев нет:

Отправить комментарий