2010-07-18 3 views
1

Когда у меня есть DataView операция, какASP.net LINQ на 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 и оставить имя как есть.

ответ

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().

+0

Поскольку переменная имеет локального использования, мне нужно EnumerableRowCollection – Swetha

+0

Позже я должен применить некоторую операцию фильтра на DataView GridView1.DataSource = query.AsDataView(); GridView1.DataSource = _t; – Swetha

+0

Тогда вы можете написать 'GridView1.DataSource = affectedRows.AsDataView();'. – SLaks

Смежные вопросы