Могу ли я обновить несколько столбцов с помощью LINQ?

#c# #linq

#c# #linq

Вопрос:

В настоящее время я использую существующий код, который имеет

 Sql.Append("UPDATE Store SET"  
"LogoAlign='"   (String.Compare(drpLogoAlign.SelectedValue, String.Empty) == 0 ? "NULL" : "'"   drpLogoAlign.SelectedValue   "'")  
"', Height='"   DB.QuerySafeDisplayHTML(txtHeight.Text.ToString())  
"', Width='"   DB.QuerySafeDisplayHTML(txtWidth.Text.ToString())  
  

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

Спасибо

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

1. предупреждение ваш код подвержен атакам с использованием sql-инъекций.

2. что вы используете linq для sql или ef?

3. Сам LINQ не выполняет обновления, только запросы. Здесь вам может помочь одна из библиотек ORM, если вы сначала привяжете соответствующий объект к GUI.

4. Я понимаю, что код уязвим для внедрения sql, будет ли linq предлагать защиту от этого? Я хочу использовать linq для sql

5. @HenkHolterman В то время как LINQ предназначен только для запросов, различные поставщики, включая LINQ to SQL, Entity Framework, LINQ to NHibernate и т. Д., Поддерживают обновления.

Ответ №1:

Для Linq To Entity вы можете просто получить все Store , чем перебирать их, чтобы изменить значение и использовать объект для SaveChanges .

Например:

 using (TestDBEntities ctx = new TestDBEntities())
{
    var allStore = ctx.Stores;
    foreach(var store in allStore)
    {
        store.LogoAlign = (String.Compare(drpLogoAlign.SelectedValue, String.Empty) == 0 ? "NULL" : "'"   drpLogoAlign.SelectedValue   "'");
        store.Height = txtHeight.Text.ToString();
    }
    ctx.SaveChanges();
}
  

Вы можете сделать то же самое с Linq To Sql с помощью DataContext.

 using (TestDataContext ctx = new TestDataContext())
{
    var allStore = ctx.Stores;
    foreach(var store in allStore)
    {
        store.LogoAlign = (String.Compare(drpLogoAlign.SelectedValue, String.Empty) == 0 ? "NULL" : "'"   drpLogoAlign.SelectedValue   "'");
        store.Height = txtHeight.Text.ToString();
    }
    ctx.SubmitChanges();
}
  

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

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

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