参数集合中已存在名为“p__linq__0”的参数。参数名称在参数集合中必须是唯一的

Posted

技术标签:

【中文标题】参数集合中已存在名为“p__linq__0”的参数。参数名称在参数集合中必须是唯一的【英文标题】:A parameter named 'p__linq__0' already exists in the parameter collection. Parameter names must be unique in the parameter collection 【发布时间】:2011-06-09 15:45:22 【问题描述】:

这是我从 Entity Framework 得到的一个奇怪的错误:“参数集合中已经存在一个名为 'p_linq_0' 的参数。参数名称在参数集合中必须是唯一的。”我没有做任何自定义参数或任何花哨的东西,只是直接的 LINQ 查询或存储过程执行,没有花哨的东西,没有什么特别的,没有 Entity SQL... 那为什么会发生这个错误呢?

谢谢。

【问题讨论】:

Entity Framework 生成的查询首先为每个名为 @p_linq_0@p_linq_1 等的输入参数声明变量。@ 有时似乎被省略了,但我不确定是什么原因这。我猜 Entity Framework 认为它正在做一些特定于其事务范围的事情,但不知何故,它的变量在多个事务中保持范围。 您使用的是什么数据库?例如,SQL Server、SQL Sever Compact、SQLite、mysql 你能发布你的代码吗? 它是在对象上下文的 SaveChanges() 调用中抛出的,我什至没有引用 @p_linq_0... 我之前也遇到过同样的错误,是我手动更改实体模型添加字段时发生的,该字段已添加到数据库中。如果您尝试删除表格,然后从服务器资源管理器中将其拖回,它应该可以工作。 (请务必先备份您的文件) 【参考方案1】:

我遇到了同样的问题 - 我在自己的 Task.Runs 中并行运行多个查询。

我的每个查询都使用了我填充的 ​​Id 列表 var ids = _someList.Select(x => x.Thing.Id).Distinct()

构造多个查询的参数,我在其中几个做string.Join(",", ids)

答案最终变得显而易见:延迟执行。

每个查询,在它正在执行string.Join(",", ids) 时,最终(同时)执行了对导致重复参数 (p_linq_0) 的 id 的查询。

只需添加.ToList() 以在该行上执行就意味着查询具有要使用的具体 ID 列表,并且并非所有人都尝试自己同时执行。

var ids = _someList.Select(x => x.Thing.Id).Distinct().ToList();

【讨论】:

【参考方案2】:

如果没有看到您的代码,我们可能无法弄清楚您的问题是什么。听起来有几件事可能会导致这种情况。不过,我似乎发现了一个。我有一个主键是枚举的模型,所以我这样做了:

context.Tests.Where(t => t.TypeId == TestTypeId.SingleTimeWholeClass)

莫名其妙地,将比较的每一边都转换为一个 int 解决了我的问题:

context.Tests.Where(t => (int)t.TypeId == (int)TestTypeId.SingleTimeWholeClass)

可能与您的问题完全无关。发布代码总是有帮助的。

【讨论】:

以上是关于参数集合中已存在名为“p__linq__0”的参数。参数名称在参数集合中必须是唯一的的主要内容,如果未能解决你的问题,请参考以下文章

sql入门语句 数据库中已存在名为某某对象

我想创建一个名为 VALIDATE_EMP 的函数,它接受 employeeNumber 作为参数,根据存在返回 TRUE 或 FALSE

使用来自 Sharepoint Designer 中已连接 LVWP 的参数的 xslt 过滤 DVWP

集合(Map可变参数Collections)

11Map可变参数Collections

如果字段数组和参数数组相交,则过滤 MongoDb 集合