Linq类型转换问题

时间:2009-10-27 15:56:39

标签: linq generic-list

为什么这个东西在第二个行中给出了消息(即列表转换)?

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。将它转换为List有什么问题?

同样,如果我写下面的内容,它会起作用:

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

为什么呢?有什么诀窍?

3 个答案:

答案 0 :(得分:3)

问题不在列表构造中,它在这一行:

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

问题是您无法在Query中显式创建实体。当您尝试创建列表时会发生这种情况,因为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();

答案 1 :(得分: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. 在从LINQ提供程序中删除之后,使用AsEnumerable创建新订单。请注意,此时它们不是正确的实体:

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

答案 2 :(得分:2)

this post的第一个答案说明了正在发生的事情。

  

实体的使用模式是它们是在查询之外创建的,并通过DataContext插入表中,然后通过查询检索,而不是由查询创建。

考虑一下,您可以使用.ToList()方法转换为列表。