为什么这个东西在第二个行中给出了消息(即列表转换)?
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);
为什么呢?有什么诀窍?
答案 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
。
两个选项(假设您试图避免获取所有其他列):
使用匿名类型:
var query = from order in dataContext.GetTable<Order>()
where order.ID == 1
select {ID = order.ID, OrderDate=order.OrderDate };
var list = query.ToList();
在从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()方法转换为列表。