Как обновить данные столбца с помощью sql-запроса в linq?

У меня есть этот запрос в sql, и он отлично работает:

update userinfo set Interest = 0.98 where userid = 313  

И я хочу сделать это в linq, поэтому я подготовил следующее:

public class TableDataDTO
{
    public string Columnname { get; set; }
    public string Value { get; set; }
    public Type DataType { get; set; }
}  

Выполнение:

TableDataDTO tableData = new TableDataDTO();
tableData.Columnname = "Interest";
tableData.Value = "0.98";

using (dbase instance = new dbase())
{
    string predicate = string.Format("it.UserID=={0} set it.{1}={2}" ,
                313, tableData.Columnname, tableData.Value);

    var uinfo = instance.userinfoes.Where(predicate).FirstOrDefault();

    if (uinfo != null)
    {
        instance.SaveChanges();
        return true;
    }
}  

Но это дает мне эту ошибку:

The query syntax is not valid. Near keyword 'SET'  

Я буду иметь дело с разными столбцами, поэтому мне нужно использовать предикаты linq, чтобы минимизировать код. Я не люблю использовать какие-либо плагины, чтобы сделать это. Надеюсь, кто-то может помочь.

Изменить

Я думаю, что я имею в виду "How to update data in using Dynamic linq"

Изменить2

Так что это реальный сценарий. Пользователи/Клиент могут обновлять свою информацию, например. Имя, Фамилия, Адрес, Город... и т.д.. не сразу, а с возможностью обновления информации один за другим.
Так что же это значит? Хорошо, я могу создать метод, который может обновлять имя, затем фамилию, адрес и так далее. Но если я это сделаю, это потребует много кода. Если бы только в linq был код, который может делать то, что делает SQL при обновлении данных, тогда мне просто нужен код, который получает имя столбца и устанавливает его значение. Надеюсь, я объяснил это хорошо.

Изменить3

Я изменил вопрос с How to update data in linq using predicates? на How to update column data using sql query in linq?, потому что неправильно понял истинное значение предиката.


person fiberOptics    schedule 25.06.2012    source источник
comment
Я думаю, вы неправильно понимаете, что означает предикат...   -  person McGarnagle    schedule 25.06.2012
comment
Буду очень признателен, если вы меня поправите. Спасибо.   -  person fiberOptics    schedule 25.06.2012
comment
если вы хотите использовать переменную в качестве имени столбца, используйте простой sql. И, да, не забудьте насладиться SQL-инъекцией.   -  person J-16 SDiZ    schedule 25.06.2012
comment
@ J-16SDiZ Вы имеете в виду, что это невозможно в LinQ?   -  person fiberOptics    schedule 25.06.2012
comment
Предикат похож на условное в этом контексте. Где фильтр. uinfo будет просто содержать все элементы instance.userinfoes, которые удовлетворяют условию.   -  person Jason Larke    schedule 25.06.2012
comment
@JasonLarke +1 за объяснение. Но у вас есть ответ на мою проблему?   -  person fiberOptics    schedule 25.06.2012
comment
@CustomException да, вы должны использовать SQL.   -  person J-16 SDiZ    schedule 25.06.2012


Ответы (2)


Ваш предикат должен быть просто частью запроса where (предикат просто возвращает true или false). Попробуй это:

instance.userinfoes.Where(user => user.userid == 313).First().Interest = 0.98;
person McGarnagle    schedule 25.06.2012
comment
Спасибо, но это не то, чем я хочу заниматься. Я не могу сделать это в более чем 50 столбцах. - person fiberOptics; 25.06.2012
comment
@CustomException ах, понял ... вы хотите выбрать 50 столбцов или обновить 50 столбцов ... или и то, и другое? - person McGarnagle; 25.06.2012
comment
@pratapk Нет, я просто не хочу создавать запросы для столбца each. - person fiberOptics; 25.06.2012
comment
@CustomException, так что вы в основном хотите создать предикат программно, верно? Что-то похожее на это? stackoverflow.com/questions/3431617/ - person McGarnagle; 25.06.2012

Вы можете структурировать LINQ аналогично тому, как вы структурируете SQL. С помощью комбинации Where и ForEach вы сможете обновить все нужные вам строки. То есть:

    instance.userinfoes.Where(it => it.UserId == 313).ToList()
                       .ForEach(
                           it => it.Interest = 0.98M
                        );

Насколько я знаю, на самом деле нет никакого способа написать SQL-подобные запросы в виде текста и передать их в обычный LINQ.

Дополнительные решения см. в этом вопросе: Обновить все объекты в коллекции с помощью LINQ< /а>

person Jason Larke    schedule 25.06.2012
comment
Эта функция выглядит следующим образом: -where-clause единственная разница в том, что я хочу использовать UPDATE, если это невозможно, то для меня это большая проблема. - person fiberOptics; 25.06.2012
comment
Насколько я могу судить, нет динамической поддержки LINQ для запуска обновления, так как нет фактического расширения LINQ для нормальной обработки этого. - person Jason Larke; 25.06.2012