我的查询有什么问题

时间:2011-04-05 04:41:40

标签: c# linq linq-to-entities

使用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'。   存在显式转换(是你   错过演员?)

3 个答案:

答案 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
}