Pergunta

Acabamos de começar a usar o LINQ to SQL no trabalho para nosso DAL e ainda não criamos um padrão para o modelo de cache.Anteriormente, usávamos uma classe base 'DAL' que implementava uma propriedade do gerenciador de cache da qual todas as nossas classes DAL herdaram, mas agora não temos isso.Gostaria de saber se alguém criou uma abordagem 'padrão' para armazenar em cache os resultados do LINQ to SQL.

Estamos trabalhando em um ambiente web (IIS), se isso faz diferença.Eu sei que isso pode acabar sendo um subjetivo pergunta, mas ainda acho que a informação seria valiosa.

EDITAR: Para esclarecer, não estou falando sobre armazenar em cache um resultado individual, estou procurando mais uma solução de arquitetura, como configurar o cache para que todos os seus métodos de link usem a mesma arquitetura de cache.

Foi útil?

Solução

Uma resposta rápida:Use o padrão Repository (consulte Domain Driven Design de Evans) para buscar suas entidades.Cada repositório armazenará em cache o que irá conter, de preferência permitindo que cada instância do repositório acesse um cache singleton (cada thread/solicitação irá instanciar um novo repositório, mas só pode haver um cache).

A resposta acima funciona apenas em uma máquina.Para poder usar isso em muitas máquinas, use memcached como sua solução de cache.Boa sorte!

Outras dicas

Meu Cache de resultados da consulta LINQ provavelmente é exatamente o que você está procurando.

var q = from c in context.Customers
        where c.City == "London"
        select new { c.Name, c.Phone };

var result = q.Take(10).FromCache();

Pete.

Está bem debaixo do seu nariz:

List<TableItem> myResult = (from t in db.Table select t).ToList();

Agora, basta armazenar em cache myResult da mesma forma que você armazenaria em cache os dados retornados do seu antigo DAL.

eu encontrei esta postagem, que oferece um método de extensão como meio de armazenar em cache os objetos LINQ.

Eu tenho batido minha cabeça contra a parede por causa dos fracos agora tentando descobrir uma boa solução de cache para Linq2SQL, e devo admitir que estou realmente lutando para encontrar uma solução que sirva para todos ...

O padrão de repositório tende a limitar a utilidade do Linq, uma vez que (sem reimplementar IQueryable) o cache deve ser executado fora da instrução Linq.

Além disso, o carregamento diferido e o rastreamento de objetos são grandes impossibilidades se você deseja armazenar seus objetos em cache, o que torna a execução de atualizações um pouco mais complicada.

Qualquer pessoa que conseguiu resolver esse problema em um projeto da web altamente simultâneo, por favor, intervenha e salve o mundo!:)

Eu entendo que esta talvez seja uma resposta um pouco tardia ...No entanto, você pode tentar o LinqToCache projeto.Ele conecta um SqlDepdency em uma consulta LINQ arbitrária, se possível, e fornece invalidação de cache ativo por meio de notificações de consulta no servidor.As consultas devem ser consultas válidas para notificações, consulte Criando uma consulta para notificação.A maioria das consultas Linq-to-sql estão em conformidade com essas restrições, desde que as tabelas sejam especificadas usando nomes de duas partes (dbo.Table, não somente Table).

Veja o método 'GetReferenceData' na classe 'ReferenceData' em Este artigo: http://blog.huagati.com/res/index.php/2008/06/23/application-architecture-part-2-data-access-layer-dynamic-linq/

Ele usa o cache de página asp.net para armazenar dados recuperados usando L2S.

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