使用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'。 存在显式转换(是你 错过演员?)
答案 0 :(得分:7)
您正在尝试将查询表达式分配给List<>
对象。那是错的。
您需要调用ToList()
将查询结果转换为找到的订单列表,并使用匿名类型,因为您只选择部分数据并创建新的匿名对象:
var r = (from p in db.Orders
select new { p.OrderID, p.OrderDate }).ToList();
请注意,匿名类型仍然是可枚举的,因为它仍然是通用的List<>
,因此它仍然实现了通用的IEnumerable<>
接口。
要形成List<Order>
,您需要检索完整的对象,所以select p
代替John Rasch说:
List<Order> r = (from p in db.Orders
select p).ToList();
或select new Order
并将其从您选择的字段中构建出来。
答案 1 :(得分:0)
NorthwindDataContext db = new NorthwindDataContext();
List<Order> r = (from p in db.Orders
select p).ToList();
选择new {...}
会创建匿名类型的新实例。如果要选择Order
,则必须从查询中返回订单。最后,您必须调用ToList(),因为Linq查询返回IEnumberable<T>
。
答案 2 :(得分:0)
或者取决于您稍后将对该查询执行的操作,将其保留为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
}