2009-10-27 1 views
1

Почему эта вещь дает сообщение в второй строке (т. Е. Конвертация списка)?Linq type conversion problem

IEnumerable<Order> MyQuery = from order in dataContext.GetTable<Order>() 
          where order.ID == 1 
          select new Order() {ID = order.ID, OrderDate=order.OrderDate }; 

      List<Order> list = new List<Order>(MyQuery); 

Сообщение:

Explicit construction of entity type 'Order' in query is not allowed. 

Если он уже преобразованы в IEnumerable. Какова его проблема, чтобы преобразовать ее в список?

Опять же, если я пишу следующее, это работает:

IEnumerable<Order> MyQuery = from order in dataContext.GetTable<Order>() 
             where order.ID == 1 
             select order; 
List<Order> list = new List<Order>(MyQuery); 

Почему? Что это за трюк?

ответ

3

Проблема не в построении списка, то в этой строке:

select new Order() {ID = order.ID, OrderDate=order.OrderDate }; 

Проблема в том, что вы не можете явно создать объект в запросе. Это происходит, когда вы пытаетесь создать свой список, потому что IEnumerable фактически не перечислили, пока вы не попытаетесь его обернуть в строке new List<Order> из-за отсроченного выполнения вашего запроса.

Похоже, вы пытаетесь получить заказы самостоятельно. Ответ, вероятно, просто выбрать порядок, а не пытаться построить новый порядок:

IEnumerable<Order> MyQuery = from order in dataContext.GetTable<Order>() 
         where order.ID == 1 
         select order; 

Кроме того, нет никаких причин, чтобы сделать перечислимы, а затем включите его в список. Вы можете просто сделать:

List<Order> list = (from order in dataContext.GetTable<Order>() 
         where order.ID == 1 
         select order).ToList(); 
+0

Предположим, что данные являются объектами String, а не Order. Я хочу, чтобы мой список имел тип uint (преобразовать строковые объекты в uint). Можно ли это сделать за один шаг? – g33kz0r

+0

@ G33kx0r Для этого может потребоваться '.AsEnumerable(). Выберите (i => UInt32.Parse (i)); 'в конце вашего запроса, поскольку ваш провайдер может быть не в состоянии сделать это напрямую. –

2

Ну, вы действительно выполняете запрос, когда конвертируете его в список. До этого это просто произвольный IQueryable.

Два варианта (при условии, что вы пытаетесь избежать выборки все остальные столбцы):

  1. Использование анонимного типа:

    var query = from order in dataContext.GetTable<Order>() 
          where order.ID == 1 
          select {ID = order.ID, OrderDate=order.OrderDate }; 
    
    var list = query.ToList(); 
    
  2. Использование AsEnumerable для создания новых заказов после они спустились с провайдера LINQ. Обратите внимание, что они не будут соответствующие лица в данный момент:

    var query = dataContext.GetTable<Order>() 
            .Where(order => order.ID == 1) 
            .AsEnumerable() // Do everything else "in process" 
            .Select(order => new Order {ID = order.ID, 
                   OrderDate=order.OrderDate }); 
    
    List<Order> list = query.ToList(); 
    
+0

Jon: В вашем варианте 1, вероятно, он не будет компилироваться, потому что вы пытаетесь создать список из IEnumerable , правильно? –

+0

Упс, исправим, чтобы использовать var (что я имел в виду :) –

+0

Я бы опасался отключенных объектов в подключенной среде. – leppie

2

Первый ответ на this post иллюстрирует то, что происходит.

Шаблон использования для сущностей заключается в том, что они создаются вне запросов и вставляются в таблицы через DataContext, а затем извлекаются через запросы, никогда не создаваемые запросами.

Рассмотрите, что вы можете использовать метод .ToList() для преобразования в список.

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

  • Нет связанных вопросов^_^