Cyc*_*eak 5 vb.net linq-to-entities entity-framework
按照我之前的问题(LINQ to Entities中仅支持无参数构造函数和初始值设定项)我仍然有一个问题.我只是想了解发生了什么以及为什么某些东西在一个案例而不是另一个案例中起作用.
如果要在Linq to entity查询中强制转换字符串参数(例如查询字符串参数),则必须使用新的Guid(request.querystring("param"))而不是Guid.parse(request.querystring("param") ")).Guid.parse将抛出异常,因为Linq无法将其转换为SQL.
我经常在我的代码中使用这种技术,它可以工作.
dim lstResult = DB.MyTable.Where(function(f) f.key = new Guid(request.querystring("param"))).toList()
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用Linq查询创建匿名类型时,它将抛出异常:
dim lstResult = DB.MyTable.Where(function(f) f.key = new Guid(request.querystring("param"))).Select(function(f) new With { .guid = f.guid, .name = f.name }).toList()
Run Code Online (Sandbox Code Playgroud)
抛出的异常是:
LINQ to Entities中仅支持无参数构造函数和初始值设定项
我可以(或应该)做的是预先声明Guid参数(这可能是一个好习惯),而不是在查询中使用它.它会工作:
dim myGuid = Guid.parse(request.querystring("param"))
dim lstResult = DB.MyTable.Where(function(f) f.key = myGuid).Select(function(f) new With { .guid = f.guid, .name = f.name }).toList()
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:为什么它会在没有创建匿名类型的情况下工作?为什么在尝试创建匿名类型时会引发异常?导致此异常的机制是什么?
当您声明将通过 LINQ toEntityProvider 执行的 LINQ 查询时,您在 LINQ 中所做的就是构造将传递给底层IQueryable提供程序的表达式树。然后,提供程序将您的 LINQ 表达式转换为数据库可以理解的语言 (SQL)。
提供程序在可以将哪些表达式转换为 SQL 方面受到限制。您的示例无法转换,因为提供程序无法将 Guid 构造函数内的方法调用转换为 SQL。我认为即使您将常量值传递给 Guid 构造函数,您最终也会遇到相同的异常,因此您必须事先创建所需的 Guid。
\n\n这是提供程序的限制,并且您不能将 LINQ to 实体与 LINQ to 对象混合使用。
\n