Pergunta

usando Linq para SQL Eu gostaria de pré-busca de alguns dados.

1) a solução comum é a de lidar com DataLoadOptions , mas na minha arquitetura não vai funcionar porque:

  • as opções têm de ser definido antes da primeira consulta
  • Eu estou usando COI, então eu não instanciar diretamente o DataContext (eu não posso executar código no instanciation)
  • meu DataContext é persistente para a duração de uma solicitação da web

2) Eu vi uma outra possibilidade com base em carregamento dados e sua criança em um método, em seguida, retornando somente os dados (para que a criança já está carregado) < a href = "http://www.west-wind.com/weblog/posts/38838.aspx" rel = "nofollow noreferrer"> veja um exemplo aqui

No entanto, na minha arquitetura, não pode não trabalho:

  • As minhas consultas são em cascata fora do meu repositório e pode ser consumido por muitos serviços que irá adicionar cláusulas
  • Eu trabalho com interfaces, os casos concretos dos objetos Linq para sql não deixam os repositórios (sim, você pode trabalhar com interfaces e adicionar cláusulas)
  • Meus repositórios são genéricos

Sim, esta arquitetura é tranquila complicado, mas é muito legal, eu posso jogar com o código como lego;)

A minha pergunta é: o que são os outras possibilidades para pré-busca de uma dados

Foi útil?

Solução

No meu aplicativo eu uso, talvez, uma variação de sua solução potencial # 2. É um pouco difícil de explicar, mas simplesmente: cadeia i e carregamento de adiar preguiçoso no meu modelo com o costume aulas preguiçosos , de modo a distância abstrato do Execution Diferido específicas de LinqToSql que aproveito com IQueryable. Benefícios:

  • O meu modelo de domínio e serviço de camada de cima não tem necessariamente de depender do provedor de LinqToSql (i pode trocar o meu DAL com interfaces se eu quiser)
  • métodos meu serviço pode e fazer retornar gráficos de objeto completo com vários 'pontos de ancoragem' para carregamento lento usando classes que abstrair um determinado implementação carregamento lento - para que eu possa usar Execução Diferido específicas de LinqToSql ou qualquer outra coisa (por exemplo, Anon delegados. . novamente, consulte esta resposta )
  • eu posso manter os resultados IQueryable todo meu aplicativo (mesmo para a interface do usuário se eu quiser) permitindo assim consulta LINQ infinita encadeamento sem ter que se preocupar com o desempenho.

Outras dicas

Eu não estou ciente de outras possibilidades, parece que você empurrou LinqToSql aos seus limites (posso estar errado, no entanto).

Eu acho que suas melhores opções neste momento são:

  1. Adicionar alguns métodos "não-genéricos" para seu aplicativo para manipular apenas o cenários específicos onde você quiser / precisar de carregamento ansioso e não fazer usar o seu, infra-estrutura "normal" "genérico" para esses métodos.
  2. Use um ORM que tem um apoio mais sofisticada para o carregamento ansioso e preguiçoso.

Eu encontrei uma solução. A minha resposta é ' injeção de dependência '.

É geralmente fornecido com o COI, e significa que você pode ter o seu recipiente COI gerenciar injeção de aulas na instanciação.

Tudo que eu preciso é injetar um CustomDCParameter classe quando eu instanciar um DC. Que a vontade da classe contém as regras, e o construtor irá aplicar todos eles.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top