微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

vb.net – Linq to entities:用于匿名类型创建和选择的新Guid(“”)

按照我之前的问题( Only parameterless constructors and initializers are supported in 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()

但是,当我尝试使用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()

抛出的异常是:

Only parameterless constructors and initializers are supported in 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()

所以,我的问题是:为什么它会在没有创建匿名类型的情况下工作?为什么在尝试创建匿名类型时会引发异常?导致此异常的机制是什么?

解决方法

当您声明将通过LINQ执行到实体提供程序的LINQ查询时,您在LINQ中所做的只是构建将传递给基础IQueryable提供程序的表达式树.然后,提供程序将LINQ表达式转换为数据库理解的语言(sql).

提供者在可以转换为sql的表达式方面受到限制.您的示例无法转换,因为提供程序无法将Guid构造函数中的方法调用转换为sql.我认为即使你将一个常量值传递给Guid构造函数,你也会得到相同的异常,所以你必须事先创建你需要的Guid.

这是提供者的限制,以及您不能将LINQ与具有LINQ的实体混合到对象这一事实.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐