【问题标题】:What casting problem on my query我的查询有什么铸造问题
【发布时间】:2011-04-05 12:57:15
【问题描述】:

在 C# vs2008 上工作。我的波纹管查询显示错误。任何人都可以告诉我是什么问题以及如何解决这个问题。提前致谢。

 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'。 存在显式转换(您是 缺少演员表?)

【问题讨论】:

    标签: c# linq linq-to-entities


    【解决方案1】:

    您正在尝试将查询表达式分配给List&lt;&gt; 对象。错了。

    您需要调用ToList() 将查询结果转换为找到的订单列表,并使用匿名类型,因为您只选择部分数据并创建新的匿名对象:

    var r = (from p in db.Orders
             select new { p.OrderID, p.OrderDate }).ToList();
    

    请注意,匿名类型仍然是可枚举的,因为它仍然是泛型 List&lt;&gt;,因此它仍然实现泛型 IEnumerable&lt;&gt; 接口。

    要形成List&lt;Order&gt;,您需要检索完整的对象,所以select p 而不是正如John Rasch 所说:

    List<Order> r = (from p in db.Orders
                     select p).ToList();
    

    select new Orders 并根据您选择的字段构建它们。

    【讨论】:

    • 以上语法显示此错误消息无法将类型'System.Collections.Generic.List'隐式转换为'System.Collections.Generic.List'
    • @shamim - 如果你想要 Orders 的列表,请将 select new { p.OrderID, p.OrderDate } 替换为 select p,然后按照 BlockClock 的建议使用 ToList()
    • @shamim:是的,我错过了。您正在选择数据子集,因此您不会获得完整的 Order 对象列表。
    • 请看问题,而不是回答为什么我使用 var 而不是 list,我想避免匿名。我知道如果我使用 p 而不是 new 关键字它工作正常。感谢回复
    【解决方案2】:
     NorthwindDataContext db = new NorthwindDataContext();
            List<Order> r = (from p in db.Orders
                     select p).ToList();
    

    选择new {...} 会创建一个匿名类型的新实例。如果您想选择Order,您必须从查询中返回订单。最后你必须调用 ToList() 因为 Linq 查询返回 IEnumberable&lt;T&gt;

    【讨论】:

      【解决方案3】:

      或者根据您稍后对该查询的处理,将其保留为 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
      }
      

      【讨论】:

        猜你喜欢
        • 2021-01-16
        • 1970-01-01
        • 1970-01-01
        • 2015-07-31
        • 2010-12-23
        • 2010-11-26
        • 2017-02-25
        • 2010-09-29
        • 1970-01-01
        相关资源
        最近更新 更多