Pergunta

O que é a melhor maneira de escrever dinamicamente consultas LINQ e expressões lambda?

Estou pensando em aplicações onde o usuário final pode criar regras de lógica de negócios, que, em seguida, devem ser executados.

Lamento se esta é uma pergunta novato, mas seria ótimo para obter as melhores práticas fora da experiência.

Foi útil?

Solução

Eu não posso recomendar mais elevado do que a leitura através dos lançamentos de Bart De Smet ( http: // comunidade. bartdesmet.net/blogs/bart/ ), ele é realmente brilhante quando se trata de Lambda.

Seus séries recentes coberta Lambda dinâmica, começando com http://community.bartdesmet.net/blogs/bart/archive/2008/08/26/to-bind-or-not-to -bind-Dynamic-expressão-árvores-part-0.aspx

código Absolutamente lindo.

Outras dicas

Outra possibilidade é integrar um tempo de execução de scripts em seu programa, de modo que os usuários podem escrever a lógica de negócios em um DSL. IronPython seria um candidato.

Eu posso ver duas maneiras que você pode gerar dinamicamente lambda de. Você poderia tentar Reflection.Emit para gerar IL (o bytecode .Net) directamente e chamá-los como um lambda ou você pode usar o System.CodeDom e Microsoft.CSharp.CSharpCodeProvider para gerar o código de construções de nível superior. O que você quer fazer depende de como você deseja que o usuário insira este material. Se você deseja que o usuário para escrever C #, então você pode simplesmente usar o construída em compliler.

Generating Linq dinamicamente deve ser mais fácil. Você deve ser capaz de gerar consultas LINQ como árvores de expressão em tempo de execução e, em seguida, passá-los em um IQueryable para executar. Eu sugiro que você olhar para a documentação sobre IQueryable para saber mais sobre isso. Outra forma seria a de pré-definir um par de consultas LINQ e, em seguida, permitir que o usuário corrente los juntos. Este deve ser viável porque qualquer consulta Linq retorna um IEnumerable que pode ser consumida pela próxima consulta Linq.

As expressões lambda podem ser facilmente criados através do namespace System.Linq.Expressions.

System.Linq.Expressions é o que você precisa. Eu escrevi uma interface agradável que permite aos usuários definir e criar consultas de forma dinâmica na forma de uma árvore de expressão. Você pode então entregar este off para Linq2SQL ou cliente de sua escolha.

Eu não entendo o que quer dizer dizer "melhor maneira". Seria melhor para fornecer exemplo simples do que você deseja alcançar. Compondo expressão LINQ dinâmica não é difícil, mas complicado.

Aqui está um exemplo de criação de expressão linq dinâmico:

Como componho existente Linq Expressões

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