在 C# 上工作 vs2008.my 下面的查询显示错误。任何人都可以告诉我问题是什么以及如何解决这个问题。提前谢谢。
NorthwindDataContext db = new NorthwindDataContext();
List<Order> r = (from p in db.Orders
select new { p.OrderID, p.OrderDate });
错误信息:
无法隐式转换类型 'System.Linq.IQueryable' 自 "System.Collections.Generic.List"。 存在显式转换(您是否 缺少演员阵容?
正在尝试将查询表达式分配给List<>
对象。这是不对的。
您需要调用ToList()
将查询结果转换为找到的订单列表,并使用匿名类型,因为您只选择部分数据并创建新的匿名对象:
var r = (from p in db.Orders
select new { p.OrderID, p.OrderDate }).ToList();
请注意,匿名类型仍然是可枚举的,因为它仍然是泛型List<>
,因此它仍然实现泛型IEnumerable<>
接口。
要形成一个List<Order>
,你需要检索完整的对象,所以select p
正如约翰·拉施所说:
List<Order> r = (from p in db.Orders
select p).ToList();
或者select new Order
s 并从您选择的字段中构建它们。
NorthwindDataContext db = new NorthwindDataContext();
List<Order> r = (from p in db.Orders
select p).ToList();
选择new {...}
将创建匿名类型的新实例。如果要选择Order
则必须从查询中返回订单。最后,您必须调用 ToList(),因为 Linq 查询返回 IEnumberable<T>
。
或者,根据您稍后将如何处理该查询,将其保留为 IQueryable(这将允许您在不拉取所有订单的情况下在服务器上进一步过滤和查询),方法是执行以下操作:
using (var context = new NorthwindDataContext())
{
var allOrders = from p in db.Orders
select new { p.OrderID, p.OrderDate };
// Here you can do further processing (to be executed in DB)
var someOrders = allOrders.Where(ao => ao.OrderDate < DateTime.Today.AddDays(-1));
Console.WriteLine(someOrders.Count()); // <-- Query will execute here
}