Pergunta

Precisamos gerar consultas LINQ que são 100% desconhecido durante a codificação (tempo de design). Isso ocorre porque a lógica está disponível em nossa estrutura, que é 100% separados de quaisquer projectos de dados. Para dados que usamos LLBLGen código de acesso de dados gerado.

Normalmente usando invoca na DLL, que especificar ao quadro (não referência) podemos criar código para recuperar dados. Mas agora nós precisamos fazer isso por linq. Como poderíamos criar uma consulta como:

var q = from customer in m.Customer
        select new
        {                   
            customer.Number,
            customer.City,
            customer.CountryEntity.Name             
        };

a partir de apenas strings. Teríamos 1 string chamado "cliente" por isso sabemos que temos de recuperar a partir do cliente. Então teríamos um string [] que contém os nomes de campos que deseja recuperar. Como você pode ver estas colunas podem incluir tipos complexos (áreas afins).

Qualquer conselho, especialmente em combinação com LLBLGen, seria ótimo!

Obrigado, Gab

Foi útil?

Solução

Eu não tenho certeza se isso é exatamente o que você está procurando, mas Scott Gu tem um post em seu blog sobre o uso de LINQ dinâmica. http://weblogs.asp.net/scottgu/archive/2008/ 07/01 / dynamic-linq-part-1-usando-the-linq-dinâmica-query-library.aspx

Pode não fazer tudo o que você precisa, mas pode você começar algum do caminho.

EDIT. Eu estava apenas ter um olhar para alguns exemplos de código que Scott Gu tinha, e descobriu que ele pode fazer a parte de seleção que você precisa. Exemplo (Este é um código de Scotts):

Dim query = db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10). _
                OrderBy("CompanyName"). _
                Select("New(CompanyName as Name, Phone)")

Como você pode ver o pouco inferior tem tem uma dinâmica escolha.

Também para resolver o problema de saber dinamicamente qual objeto de consulta em tempo de execução, você poderia algo como isto:

 Sub query(Of T)(ByVal Myobject As IQueryable(Of T))
    Dim i = Myobject.Select("New(customer.Number)")
 End Sub

Em seguida, você poderia apenas fazer uma pequena chave depois de ler os nomes do banco de dados, assim:

Sub PassIt()
    Dim name = "customer"
    Select Case name
        Case "customer"
            query(m.Customer)
    End Select
End Sub

Espero que isso ajude. Nota! Haveria uma maneira melhor de fazer a última parte (método passit), mas a sua para de manhã cedo para pensar sobre isso.

Infelizmente a resposta é em VB eu deveria ter feito isso em C #

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