Преобразовать DataTable в LINQ: невозможно запросить несколько полей - PullRequest
3 голосов
/ 27 июля 2010

Импорт электронной таблицы Я заполнил объект DataTable этими данными и возвращает ожидаемые результаты.

Попытка преобразовать это в формат, который я могу легко запросить для поиска записей проблем, я сделал следующее

public void Something(DataTable dt)
{
     var data = from row in dt.AsEnumerable()
                select row["Order"].ToString();
}

Работает, как и ожидалось, давая мне список заказов.Однако я не могу добавить другие поля к этой коллекции EnumerableRowCollection.Попытка добавить другие поля следующим образом приводит к ошибке

public void Something(DataTable dt)
{
     // row["Version"] throws an error on me
     var data = from row in dt.AsEnumerable()
                select row["Order"].ToString(), row["Version"].ToString();
}

Ошибка: «Локальная переменная с именем« строка »не может быть объявлена ​​в этой области, поскольку она придала бы другое значение« строке », которая ужеиспользуется в «дочерней» области, чтобы пожертвовать что-то еще »

Я думаю, мне нужно псевдоним имени столбца, но мне не повезло.Что мне здесь не хватает?

Ответы [ 3 ]

4 голосов
/ 27 июля 2010

Звучит так, как будто вы пишете неверный оператор выбора. Попробуйте следующее:

public void Something(DataTable dt)
{
    var data = from row in dt.AsEnumerable()
               select new { 
                            Order = row["Order"].ToString(), 
                            Something = row["Something"].ToString(),
                            Customer = row["Customer"].ToString(),
                            Address = row["Address"].ToString()
                          };
}

Это создаст новую коллекцию объектов с анонимным типом, которую вы можете перебирать и использовать по мере необходимости. Имейте в виду, однако, что вы хотите иметь возможность вернуть data из функции. Если вам нужна эта функциональность, вам нужно создать конкретный тип для использования (вместо анонимных типов).

2 голосов
/ 27 июля 2010

Я думаю, вы должны использовать select new, как этот запрос, например:

var q = from o in db.Orders
        where o.Products.ProductName.StartsWith("Asset") && 
              o.PaymentApproved == true
        select new { name   = o.Contacts.FirstName + " " +
                              o.Contacts.LastName, 
                     product = o.Products.ProductName, 
                     version = o.Products.Version + 
                              (o.Products.SubVersion * 0.1)
                   };
0 голосов
/ 27 июля 2010

Вы, вероятно, хотите следующее.

var data = from row
           in dt.AsEnumerable()
           select new { Order = row["Order"].ToString(), Version = row["Version"].ToString() };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...