1

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

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

为什么?诀窍是什么?

4

3 回答 3

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();
于 2009-10-27T16:00:19.973 回答
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();
    
于 2009-10-27T16:02:07.927 回答
2

这篇文章的第一个答案说明了正在发生的事情。

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

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

于 2009-10-27T16:02:26.820 回答