gpt4 book ai didi

vb.net - 链接到实体 : new Guid ("") for anonymous type creation vs select

转载 作者:行者123 更新时间:2023-12-04 21:44:49 32 4
gpt4 key购买 nike

在我之前的问题 ( Only parameterless constructors and initializers are supported in LINQ to Entities ) 之后,我还有一个问题。我只是想了解正在发生的事情以及为什么某些事情在一种情况下有效而不是另一种情况。

当您想在 Linq 中将字符串参数(例如查询字符串参数)转换为实体查询时,您必须使用 new 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 to entity 提供程序执行的 LINQ 查询时,您在 LINQ 中所做的就是构建将传递给底层 IQueryable 的表达式树。提供者。然后提供程序将您的 LINQ 表达式转换为数据库可以理解的语言 (SQL)。

提供程序在哪些表达式可以转换为 SQL 方面受到限制。您的示例无法转换,因为提供程序无法将 Guid 构造函数内的方法调用转换为 SQL。我认为即使您将常量值传递给 Guid 构造函数,您最终也会遇到相同的异常,因此您必须事先创建所需的 Guid。

这是提供程序的限制以及您不能将 LINQ to entity 与 LINQ to objects 混合使用的事实。

关于vb.net - 链接到实体 : new Guid ("") for anonymous type creation vs select,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16149388/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com