При изменении типа объекта с IEnumerable на IQueryable, начал получать ошибку контекста LINQ - PullRequest
0 голосов
/ 21 июня 2019

Я новичок в Linq и Entity Framework.Мне было поручено изменить параметр метода с IEnumerable на IQueryable.Нет ошибок компилятора, но во время выполнения я получаю «Указанное выражение LINQ содержит ссылки на запросы, связанные с различными контекстами.»

Я искал SO в частности и Google в целом.Ошибка связана, как говорится, с присоединением к различным контекстам.Я не присоединяюсь ни к чему.Соответствующий запрос отлично работает как IEnumerable.

public ActionResult Index()
{
    //The query in question. Works as IEnumerable
    //Original code:
    //IEnumerable<Request> hasTickets = context.Requests.Where(x => x.RequestorID == User);
    IQueryable<Request> hasTickets = context.Requests
    .Where(x => x.RequestorID == User);

    //This is the method being used to scrub the data 
    //not included here). This method has been changed 
    //to take a parameter of IQueryable.
    hasTickets = SecurityTrimRequests(hasTickets);

    int hasTicketCount = 0;

    //Errors on this line when query is called. I just need
    //a count of the number of tickets a user has in the dB.
    hasTicketCount = hasTickets.Count();

    if (IsSupplyTeam)
    {
        return View();
    }
    else if (hasTicketCount > 0)
    {
        return View();
    }
    else
    {
        return RedirectToAction("Index", "Home");
    }
}

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

До того, как используемый метод был изменен на IQueryable, код работал нормально.Теперь он имеет ошибки во всем.Приведенный выше код - самый простой пример, который у меня есть.

1 Ответ

0 голосов
/ 21 июня 2019

Я бы сказал, что проблема будет в SecurityTrimRequests, который не включен. IQueryable создает команды Linq, затем выполняется во время .Count(), где IEnumerable материализуется в список объектов, затем код работает с материализованным списком.

Один из способов сделать то же самое - вернуть список IEnumerable с помощью .AsQueryable(), который преобразует ваш список в IQueryable.

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