c# - Linq to Entities - Contar elementos de uma query que referencie dois contextos - Stack Overflow em Português
var query = (from q1 in query1
join q2 in query1 on q1.idGenerico equals q2.idGenerico into q2Left
from q2 in q2Left.DefaultIfEmpty()
join q3 in query3 on q2.idGenerico equals q3.idGenerico  into q3Left
from q3 in q3Left.DefaultIfEmpty()
select new { q1, q2, q3});
Basicamente ela é uma query para agrupar outras, que são de contextos diferentes, a partir dela eu tenho que pegar o total de registros resultantes desse agrupamento, e popular uma lista de objetos que serão retornados pelo método da query.
meu problema é: Ao tentar fazer qualquer tipo de manipulação com a query, eu recebo a seguinte excessão:
"The specified LINQ expression contains references to queries that are associated with different contexts"
no SO eu encontrei a seguinte resposta (https://stackoverflow.com/questions/7332920/error-the-specified-linq-expression-contains-references-to-queries-that-are-as) que se encaixa no meu caso:
minha pergunta é: quais outras soluções eu tenho para esse problema? sou obrigado a criar uma view?
editada 16/03/18 às 19:05
Não recomendo em casos de grande massa de dados, mas desde que você traga para memória o resultado das duas queries, os contextos se tornam irrelevantes. – Gabriel Coletta 16/03/18 às 19:09
O problema é exatamente esse, a massa de dados tem que ser levada em conta. – M. Bertolazo 16/03/18 às 19:18
Eu reunião com um desenvolvedor mais experiente foi encontrada a seguinte solução:
Primeiramente eu consegui reduzir uma das querys por já existir uma view em banco com os dados da terceira.
Trabalhando com duas querys, de contextos diferentes, para pegar o total de registros (para paginar) e apenas uma amostra de registros (elementos de uma página) as consultas foram executadas na seguinte ordem:
1 - Executo a primeira query, atribuindo-a a um objeto Iqueryable.
2 - Aplico os filtros á primeira query (como são filtros dinâmicos, que podem ou não estarem preenchidos, não posso aplicá-los na consulta).
3 - Trago para uma Lista (LINQ To Objects) a chave que irá fazer o join entre os dois contextos. ex: query1.select(x => x.idTabelaOutroContexto).ToList();
4 - Executo a segunda query com base na lista acima.
5 - Aplico os filtros, também dinâmicos á segunda query.
6 - Atualizo a lista com as chaves com base dos registros da segunda query filtrada.
7 - Filtro a primeira query baseada na lista atualizada.
8 - Agora que filtrei a primeira query com base no retorno da segunda, alcanço o primeiro objetivo, o total de registros.. que é o count da primeira.
9 - Recolho as amostras das duas querys separadas trazendo para memória.
10 - Faço uma terceira query agrupando as listas criadas a partir da consulta das duas primeiras, e alcanço o segundo objetivo, que era coletar a amostra de dados.
respondida 16/03/18 às 19:17
O objeto iqueryable deve ficar enorme, mas a consulta é executada rapidamente e atende. – M. Bertolazo 16/03/18 às 19:19
Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag c# query linq linq-to-entities ou faça sua própria pergunta.