2009-10-27 87 views
1

为什么这个东西在第二行行(即列表转换)给出消息?Linq类型转换问题

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

问题并不在列表建设,这是在这一行:

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 2011-11-27 13:19:37

+0

@ G33kx0r它可能需要一个'。AsEnumerable()。Select(i => UInt32.Parse(i));'在查询结束时,因为您的提供者可能无法直接执行此操作。 – 2011-11-27 17:56:07

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

乔恩:在你的选项1中,它可能不会编译,因为你试图从IEnumerable 构造一个列表,对吧? – 2009-10-27 16:04:58

+0

糟糕,将修复使用var(这就是我的意思:) – 2009-10-27 16:08:40

+0

我会对连接环境中断开连接的对象保持警惕。 – leppie 2009-10-27 16:14:55

2

第一个答案this post说明发生了什么事情。

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

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