Чистый синтаксис для удаления записи в linqtosql - PullRequest
2 голосов
/ 22 октября 2008

Каков наилучший способ удаления записи базы данных с помощью LINQ, когда у меня есть первичный ключ?

Ответы [ 6 ]

2 голосов
/ 22 октября 2008

Если вы установите проверки обновлений во всех ваших столбцах на никогда или при изменении , вы можете просто присоединить экземпляр с первичным ключом и удалить строку без груза.

public void DeleteCustomer(int CustomerID)
{
    NorthwindContext c = new NorthwindContext c;
    Customer target = new Customer(){CustomerID = CustomerID};
    c.Customers.Attach(target);
    c.Customers.DeleteOnSubmit(target);
    c.SubmitChanges();                       
}
2 голосов
/ 22 октября 2008

Такой подход приемлем и типичен.

Это немного расточительно, потому что вы запрашиваете всю запись. Этого нельзя избежать, учитывая сигнатуру метода DeleteOnSubmit.

Почему LINQ to SQL работает таким образом? Ответы очевидны, если вы думаете о таблицах, которые не имеют первичных ключей, или используете составные ключи. Для LINQ to SQL нужна целая запись в худшем случае, когда необходимо сопоставить каждое свойство объекта с полями таблицы.

Но как следует спросить обо всех проблемах производительности - вы абсолютно уверены, что это проблема производительности для вас? Где ваше доказательство профилирования?

Я еще не пробовал, но может быть способ достичь того же с помощью DataContext.ExecuteCommand .

1 голос
/ 22 октября 2008
  public static Delete(this ITable table, object key)
   { var t = table.GetType();
     var tableName  = t.GetCustomAttributes
                                    (typeof(TableAttribute),false)[0].Name;
     var primaryKey = (from p in t.GetProperties()
                       from c in p.GetCustomAttributes
                                            (typeof(ColumnAttribute),false)
                       where c.IsPrimaryKey
                       select c.Name).Single();
     using (var cmd = table.Context.Connection.CreateCommand())
      { cmd.CommandText = string.Format( "DELETE FROM {0} WHERE {1} = @key"
                                        ,tableName, primaryKey);
        cmd.Parameters.Add(new SqlParameter("@key", key));
        cmd.ExecuteNonQuery();        
      }            
   }

/* ... */
dataContext.Table1.Delete(id);
1 голос
/ 22 октября 2008

В итоге я сделал выбор, но улучшил свой синтаксис, который, как мне кажется, действительно беспокоил меня:

Старый:

var products = from p in db.Products select p;
db.Products.DeleteOnSubmit(products.Take(1).Single()); <--seemed nasty
db.SubmitChanges();

Новое:

Service service = db.Services.Where(s => s.id == serviceID).FirstOrDefault(); <--nicer
db.Services.DeleteOnSubmit(service);
db.SubmitChanges();
0 голосов
/ 22 октября 2008

Я всегда использовал подход «выбор-удаление», так как он очень прост. Как сказал Маршидад, вы можете отобразить сохраненный процесс, если вы действительно этого хотите. Я считаю, что в будущем ESQL планирует поддерживать операции вставки, обновления и удаления.

0 голосов
/ 22 октября 2008

Вы можете сопоставить хранимую процедуру с методом в DataContext, который удаляет запись с заданным значением для первичного ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...