【问题标题】:An unhandled exception of type 'System.InvalidCastException'“System.InvalidCastException”类型的未处理异常
【发布时间】:2015-07-23 20:35:26
【问题描述】:

我的 C# VS2015 应用程序抛出此异常:

System.InvalidCastException 未处理

Message=无法投射 类型的对象 'System.Data.Entity.Infrastructure.DbQuery`1[ADONET4LINQtoENTITIES.Customer]' 键入“System.Data.Objects.ObjectQuery”。
来源=ADONET4LINQtoENTITIES

错误发生在定义查询变量的行:

var customers = from c in de.Customers
                where c.Orders.Any(o => o.OrderAmount > 150)
                select c;
 
string query = ((ObjectQuery)customers).ToTraceString();

我的假设是ObjectQuery 正在提示异常。

我尝试了string query = ((DbQuery)customers).ToString(),它在 VS2013 中有效,但这导致了同样的异常。

为什么 VS2015 使用这些查询方式会抛出异常?

【问题讨论】:

  • 错误信息说明了一切:customers 的类型为 DbQuery<ADONET4LINQtoENTITIES.Customer>,而不是 DbQueryObjectQuery
  • 您是否使用相同版本的 EF 工作时和不工作时? It seems they're not related anymore.
  • @manji 实现就像魅力一样。我只需要添加:using System.Data.Entity.Infrastructure,并将query 定义中的ToTraceString() 调整为ToString()

标签: c# database linq visual-studio-2015


【解决方案1】:

因为Customers 不是ObjectQuery 你想要的是ObjectQuery<Customer> 所以也删除投影(Select)。

改成

var CustomersQuery= from c in de.Customers
                    where c.Orders.Any(o => o.OrderAmount > 150);

string query =  CustomersQuery.ToTraceString();

我通过将其命名为CustomersQuery 来消除命名词汇的歧义。

更多信息请参见ObjectQuery.ToTraceString Method (System.Data.Objects)

【讨论】:

  • 那不是有效的 linq 语句。在该表单中时,查询的 select 部分是必需的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 2012-12-22
  • 2016-12-06
相关资源
最近更新 更多