Параметр с именем 'p__linq__0' уже существует в коллекции параметров. Имена параметров должны быть уникальными в коллекции параметров - PullRequest
3 голосов
/ 09 июня 2011

Это странная ошибка, которую я получаю от Entity Framework: «Параметр с именем« p_ linq _0 »уже существует в коллекции параметров. Имена параметров должны быть уникальными в коллекции параметров».Я не делаю никаких пользовательских параметров или чего-либо необычного, просто прямые запросы LINQ или выполнения хранимых процедур, ничего необычного, ничего необычного, никакого Entity SQL ... так почему бы произошла эта ошибка?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 17 апреля 2015

У меня была та же проблема - я выполнял несколько запросов параллельно в их собственных Task.Run s.

Каждый из моих запросов использовал список идентификаторов, которые я заполнял с var ids = _someList.Select(x => x.Thing.Id).Distinct()

При построении параметров нескольких запросов я выполнял string.Join(",", ids) в нескольких из них.

В конечном итоге ответ стал очевидным: отложенное выполнение.

Каждыйзапрос, в точке, где он выполнял string.Join(",", ids), наконец выполнил запрос для идентификаторов (в то же время), вызывая дублирующийся параметр (p_linq_0).

Просто добавив .ToList() для выполнения в этой строкеозначало, что запросы содержали конкретный список идентификаторов, и не все пытались сделать это одновременно.

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

0 голосов
/ 20 марта 2014

Не видя ваш код, мы не можем понять, в чем ваша проблема.Похоже, есть несколько вещей, которые могут вызвать это.Я, кажется, обнаружил один, хотя.У меня есть модель, первичным ключом которой является enum, поэтому я делал это:

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

Необъяснимо, что приведение каждой стороны сравнения к int решило мою проблему:

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

Может быть совершенно не связан с вашей проблемой.Почтовый код всегда помогает.

...