ASP.net LINQ в DataView

Когда у меня есть операция DataView как

 EnumerableRowCollection<DataRow> query 
    = from order in _table.AsEnumerable()
      where order.Field<Int32>("key") > 2 && order.Field<Int32>("key") < 4
      select order.Field<Int32>("key")=1000, order.Field<string>("name");   

Я не могу составить приведенное выше выражение.

когда я пытаюсь

select new {key= 1000,name= order.Field<string>("name") };

я получил

    Cannot implicitly convert type 
   'System.Data.EnumerableRowCollection<AnonymousType#1>'   
    to 'System.Data.EnumerableRowCollection<System.Data.DataRow>'

Как сформировать правильный запрос? Моя задача заменить ключ на 1000 и оставить имя как есть.


person Swetha    schedule 18.07.2010    source источник


Ответы (1)


Когда вы пишете select new {key= 1000,name= order.Field<string>("name") }, вы создаете новый анонимный тип, который не имеет ничего общего с DataRow.
Следовательно, вы не можете присвоить его EnumerableRowCollection<DataRow>.

Чтобы исправить ошибку компилятора, измените EnumerableRowCollection<DataRow> на var.


Однако это не решит основной проблемы.
LINQ нельзя использовать для изменения данных.

Вам нужно использовать обычный цикл foreach и установить значения key, например так:

var affectedRows = from order in _table.AsEnumerable()
  where order.Field<Int32>("key") > 2 && order.Field<Int32>("key") < 4
  select row;
foreach(DataRow row in affectedRows) {
    row["key"] = 1000;
}

Этот код изменит исходные DataRow в исходных _table.
Если вы не хотите изменять исходные _table, вы можете скопировать их, вызвав DataTable.Copy().

person SLaks    schedule 18.07.2010
comment
Поскольку var используется локально, мне нужен EnumerableRowCollection - person Swetha; 18.07.2010
comment
Позже мне нужно применить некоторую операцию фильтрации к DataView GridView1.DataSource = query.AsDataView(); GridView1.DataSource = _t; - person Swetha; 18.07.2010
comment
Затем вы можете написать GridView1.DataSource = affectedRows.AsDataView();. - person SLaks; 18.07.2010
comment
спасибо, теперь я могу выполнить задачу, спасибо за ваш код. - person Swetha; 18.07.2010
comment
Затем вы должны принять этот ответ, щелкнув пустую галочку. - person SLaks; 18.07.2010