Как запустить массовое обновление / удаление запроса в Linq? - PullRequest
8 голосов
/ 23 декабря 2009

У меня есть 2 класса Linq2Sql: Parent и Child. Я хочу сделать такие вещи, как удаление всех дочерних элементов для родителей или обновление всех дочерних записей. В SQL я бы написал:

delete Child where ParentID = @p

или

update Child set Val = Val+1 where ParentID = @p

Я могу сделать это в Linq, используя грубую силу внутри класса Parent:

Children.ToList().ForEach(c => c.DeleteOnSubmit()); // DeleteOnSubmit is my own method

и

Children.ToList().ForEach(c => c.Val++);

Но, учитывая присущие Linq потери производительности в циклах ForEach, это кажется очень неэффективным способом выполнения задач. Есть ли какой-нибудь способ достижения желаемой цели, который будет запускать ровно один запрос?

Ответы [ 5 ]

14 голосов
/ 23 декабря 2009

В этих случаях вы можете использовать метод DataContext.ExecuteCommand для непосредственного выполнения SQL в вашей базе данных. Например:

dataContext.ExecuteCommand("delete Child where ParentID = {0}", parentId);
9 голосов
/ 23 декабря 2009

Посмотрите на эту ссылку: он использует ExpressionTree: http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx [Неработающая ссылка]

http://terryaney.wordpress.com/2008/04/14/batch-updates-and-deletes-with-linq-to-sql/ [Возможно, правильный]

2 голосов
/ 05 января 2010

Взгляните на http://magiq.codeplex.com массовую операцию с linq.

1 голос
/ 16 марта 2017

Обновление и удаление

Текущее ограничение Entity Framework - это то, что для обновления или удаления объекта вы должны сначала извлечь его в память. Кроме того, для одиночных удалений объект должен быть извлечен до того, как он может быть удален, требуя двух обращений к базе данных. Чтобы преодолеть эту проблему, мы должны расширить текущую структуру сущностей, используя EntityFramework.Extended. EntityFramework.Extended имеет полезные функции, такие как пакетное обновление и удаление, журнал аудита, кэш результатов запросов, будущие запросы. Пакетное обновление и удаление устраняет необходимость извлекать и загружать объект перед его изменением. Вот несколько строк кода, демонстрирующих, как удалять, обновлять.

Установка через nuget

PM> Install-Package EntityFramework.Extended

Обновление

Сценарий: обновление клиентов, которые имеют страну США. Если мы делаем это без каких-либо расширений, мы должны выбрать всех клиентов, которые имеют страну USA, изменить список и обновить его с помощью циклов. Используя Entity Framework.Exdended нам не нужно извлекать список клиентов, просто добавьте условие «Где», задайте данные для обновления и выполните запрос.

static void Main(string[] args)   
{   
    using(var db = new DataContext())   
    {   
        db.Customers.Where(c => c.Country == "USA").Update(c => new Customer()   
        {   
            Country = "IN"   
        });   

        foreach(var customer in db.Customers.ToList())    
        {   
            Console.WriteLine("CustomerInfo - {0}-{1}-{2}", customer.Name, customer.Country, customer.Status);   
        }   
    }   

    Console.ReadLine();   
}

https://code.msdn.microsoft.com/entity-framework-batch-994cd739

0 голосов
/ 11 апреля 2014

Попробуйте это

_db.tblStockAllocationEurails.Where(t => t.StockNo >= From && t.StockNo <= To).ToList().ForEach(t => t.StatusID = NewGuid);
_db.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...