Comandos de consulta e / ou especificações bem projetados

Eu tenho procurado por algum tempo para uma boa solução para os problemas apresentados pelo padrão típico do Repository (lista crescente de métodos para consultas especializadas, etc. ver:http://ayende.com/blog/3955/repository-is-the-new-singleton).

Eu realmente gosto da idéia de usar consultas de comando, particularmente através do uso do padrão de especificação. No entanto, meu problema com a especificação é que ela se relaciona apenas com os critérios de seleções simples (basicamente, a cláusula where) e não lida com outros problemas de consultas, como junção, agrupamento, seleção de subconjunto ou projeção, etc. Basicamente, todos os aros extras que muitas consultas precisam passar para obter o conjunto correto de dados.

(Nota: eu uso o termo "comando" como no padrão de comando, também conhecido como objetos de consulta. Eu não estou falando sobre o comando como no comando / separação de consulta onde há uma distinção entre consultas e comandos (atualização, exclusão, inserir))

Então, estou procurando alternativas que encapsulem toda a consulta, mas ainda flexíveis o suficiente para que você não apenas troque Repositórios de espaguete por uma explosão de classes de comando.

Eu usei, por exemplo, o Linqspecs, e embora eu encontre algum valor em poder atribuir nomes significativos a critérios de seleção, isso não é suficiente. Talvez eu esteja procurando uma solução combinada que combina várias abordagens.

Estou à procura de soluções que outras pessoas possam ter desenvolvido para resolver esse problema ou resolver um problema diferente, mas que ainda atenda a esses requisitos. No artigo vinculado, Ayende sugere o uso direto do contexto do nHibernate, mas acho que isso complica muito a sua camada de negócios, porque agora ela também contém informações de consulta.

Eu vou oferecer uma recompensa por isso, assim que o período de espera acabar. Então, por favor, tornem suas soluções recompensadoras, com boas explicações e eu selecionarei a melhor solução, e melhorarei os vice-campeões.

NOTA: Estou procurando por algo que seja baseado em ORM. Não precisa ser EF ou nHibernate explicitamente, mas esses são os mais comuns e caberiam melhor. Se puder ser facilmente adaptado a outros ORMs, isso seria um bônus. Linq compatível também seria bom.

ATUALIZAÇÃO: Estou realmente surpreso com o fato de não haver muitas boas sugestões aqui. Parece que as pessoas são totalmente CQRS, ou estão completamente no campo Repository. A maioria dos meus aplicativos não é complexa o suficiente para garantir o CQRS (algo com a maioria dos defensores do CQRS prontamente dizendo que você não deve usá-lo).

ATUALIZAÇÃO: Parece haver um pouco de confusão aqui. Não estou procurando uma nova tecnologia de acesso a dados, mas uma interface razoavelmente bem projetada entre negócios e dados.

Idealmente, o que estou procurando é algum tipo de cruzamento entre objetos de consulta, padrão de especificação e repositório. Como eu disse acima, o padrão de especificação lida apenas com o aspecto da cláusula where, e não com os outros aspectos da consulta, como junções, sub-seleções, etc. Repositórios lidam com toda a consulta, mas ficam fora de controle depois de um tempo . Objetos de consulta também lidam com toda a consulta, mas eu não quero simplesmente substituir repositórios com explosões de objetos de consulta.