Desenhando Edms e criando queries dinâmicas

Visitamos outro dia os arquitetos de uma empresa de ERP que estão desenvolvendo com o Entity Framework e eles nos trouxeram duas questões interessantes: 1) Como dividir edms (entity data models) quando muitas tabelas? 2) Como fazer queries dinâmicas em link?

Nossas respostas:

1) Preferimos casar edms com domínios – pense em domain driven design. Crie e descreva os cenários de negócio e coloque no edm apenas as entidades e relacionamentos que são necessárias para este cenário. Feito isto, na certa você terá entidades redundantes entre edms. Por exemplo, produto aparece nos edms relacionado a pedidos e estoque. Como lidar com isto? Algumas soluções:

a. Use views;

b. Coloque produto em outro edm e, se precisar, faça uma querie em um edm (por ex.: produtos de certa categoria) e use seu resultado numa querie no outro (ex.: where itemPedido.produto in ...);

c. Verifique se estas entidades são usadas como read-only nas queries deste domínio – isto é, são entidades auxiliares?Se sim, e caso não haja impacto na regra de negócio se houver uma edição desta entidade por outro cliente/thread, aceite a redundância;

Você sabe/usa alguma outra opção?

2) Poucos sabem, mas queries dinâmicas podem ser escritas em Linq. Isto é: é possível criar uma query e a modificarmos de acordo com a necessidade, adicionando, por exemplo, restrições em cláusulas where, etc. A maneira de fazer isto é ainda um pouco dura, mas já existem textos e projetos que ajudam. Aqui vão algumas referências:

a. O livro Programming Microsoft® LINQ (PRO-Developer) tem um capítulo só sobre o tema;

b. Dê uma olhada neste exemplo no MSDN ou neste blog ou neste;

c. Se precisar, existe um código para visitar uma expressão em linq neste blog;

d. Vi também um projeto para modificar arvores de expressão no codeplex: https://www.codeplex.com/xte . Não testei, mas creio que talvez ajude;

Boa semana