加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 07:27:36 所属栏目:百科 来源:网络整理
导读:按照我之前的问题( Only parameterless constructors and initializers are supported in LINQ to Entities),我仍然有一个问题.我只是想了解发生了什么以及为什么某些东西在一个案例而不是另一个案例中起作用. 如果要在Linq to entity查询中强制转换字符串参
按照我之前的问题( 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的实体混合到对象这一事实.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读