提问人:user366312 提问时间:10/27/2009 最后编辑:casperOneuser366312 更新时间:5/21/2012 访问量:967
Linq 类型转换问题
Linq type conversion problem
问:
为什么这个东西在第二行(即列表转换)中给出消息?
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);
为什么?诀窍是什么?
答:
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
两个选项(假设您试图避免获取所有其他列):
使用匿名类型:
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赞
cloggins
10/28/2009
#3
这篇文章的第一个答案说明了正在发生的事情。
实体的使用模式是,它们是在查询之外创建的,并通过 DataContext 插入到表中,然后通过查询检索,而不是通过查询创建。
考虑一下,您可以使用 .ToList() 方法转换为列表。
评论