Присоединить массив к EF-запросу - PullRequest
4 голосов
/ 18 июня 2011

При попытке присоединить массив к запросу Linq-to-EF я получаю следующую ошибку

Произошла ошибка при выполнении определения команды.Смотрите внутреннее исключение для деталей.Некоторая часть вашего оператора SQL вложена слишком глубоко.Перепишите запрос или разбейте его на более мелкие запросы.

Код выглядит следующим образом:

var vids = new List<string>();
using (var ctx = new MyDbContext())
{
    var qry = ctx.Pickups.Where(p => p.UserName == User.Identity.Name);
    if (someBoolean)
    {
        var v = GetVids(); // get the list of Ids from a web service
        vids.AddRange(v);
    }
    if (vids.Count() > 0)
    {
        qry = qry.Join(vids, p => p.VId, v => v, (v, p) => p);
    }
    var data = qry
        .Select(p => new
        {
            // etc.
        });
}

Проблема заключается в том, что веб-служба не связана с БД I 'Я использую EF с, иначе я бы просто сделал соединение с таблицами в БД.Количество идентификаторов, которые я получаю от веб-службы, может превышать сотню или около того (обычно 5-10).Если я закомментирую Join, код работает нормально, поэтому я знаю, что ошибка в Join.При наличии нескольких (до 30) идентификаторов в vids соединение работает идеально.

Что вы порекомендуете для решения этой проблемы?Единственное, о чем я мог подумать, это вставить список идентификаторов в БД и выполнить соединение таким образом.Мне это не кажется привлекательным.

1 Ответ

5 голосов
/ 18 июня 2011

Попробуйте заменить if (vids.Count() > 0) на:

if (vids.Count > 0)
{
    qry = qry.Where(arg => vids.Contains(arg.VId));
}

Это будет работать, только если vids меньше 2100 элементов, так как это будет переведено в IN (x, y, .., n) условие.

Если вы используете Entity Framework 3.5, Contains не будет работать. Вы можете найти возможное решение здесь: Обходной путь 'Contains ()' с использованием Linq to Entities?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...