ASP.net LINQ на DataView - PullRequest
       10

ASP.net LINQ на DataView

1 голос
/ 18 июля 2010

Когда у меня операция 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 Ответ

1 голос
/ 18 июля 2010

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

* 1006.* Чтобы исправить ошибку компилятора, измените 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().

...