Linq 类型转换问题

Linq type conversion problem

提问人:user366312 提问时间:10/27/2009 最后编辑:casperOneuser366312 更新时间:5/21/2012 访问量:967

问:

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

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

为什么?诀窍是什么?

LINQ 通用列表

评论


答:

3赞 Reed Copsey 10/28/2009 #1

问题不在于列表构造,而在于这一行:

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赞 11/27/2011
假定数据是 String 对象,而不是 Order。我希望我的列表类型为 uint(将字符串对象转换为 uint)。这可以一步到位吗?
2赞 Jon Skeet 10/28/2009 #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赞 cloggins 10/28/2009 #3

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

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

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