LightSwitch - Duvida linq to Entities
-
terça-feira, 31 de janeiro de 2012 17:05
Boa Tarde
Estou precisando fazer uma validação em uma determinada Tela de uma aplicação LightSwitch, no qual é necessário a utilização de um Left Join entre duas Entidade, procurei na documentação algumas possbilidade e cheguei a esse comando.
Dim Cla_Invalidas = _
From Ct In entity.PROJETOS_APONTAMENTOS_DESPESAS _
Group Join Cp In Projetos_Despesas_Por_Projeto(entity.PROJETOSItem.PROJETO) _
On Ct.CLASSIF_FINANCEIRASItem.CLASSIF_FINANCEIRA _
Equals Cp.CLASSIF_FINANCEIRASItem.CLASSIF_FINANCEIRA Into Class_Group = Group _
Select New With _
{ _
.DESCRICAO = Ct.CLASSIF_FINANCEIRASItem.DESCRICAO _
}
Porem, o IDE me apresenta a seguinte mensagem de erro.Não é possível deduzir os tipos de dados dos parâmetros de tipo no método de extensão 'Public Function GroupJoin(Of TInner, TKey, TResult)(inner As System.Collections.Generic.IEnumerable(Of TInner), outerKeySelector As System.Func(Of PROJETOS_APONTAMENTOS_DESPESASItem, TKey), innerKeySelector As System.Func(Of TInner, TKey), resultSelector As System.Func(Of PROJETOS_APONTAMENTOS_DESPESASItem, System.Collections.Generic.IEnumerable(Of TInner), TResult)) As System.Collections.Generic.IEnumerable(Of TResult)' definido em 'System.Linq.Enumerable' com base nesses argumentos.O que eu estou fazendo de errado ?Muito Obrigado.
Todas as Respostas
-
terça-feira, 31 de janeiro de 2012 17:18Moderador
Olá Victor,
Projetos_Despesas_Por_Projeto é um método?
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique -
terça-feira, 31 de janeiro de 2012 18:32
Ola Fernando.
Sim, no LightSwitch podemos criar uma query ligada a uma entidade, ou seja, esse metodo retorna uma Collection do Objeto "PROJETOS_DEPESAS", que por sua vez é composto por uma propriedade CLASSIF_FINANCEIRA, propriedade ess que tambem existe na Entidade PROJETOS_APONTAMENTOS depesas.
Resumindo, as duas tabelas se relacionam ao cadastro de Classificações Financeiras, quero que quando o Usuario efetuar um "Apontamento" para um determinado Projeto ele somente possa usar Classificações Previamente Cadastradas para esse projeto (PROJETOS_DESPESAS).
Entendeu ?
Victor Perez
-
terça-feira, 31 de janeiro de 2012 18:42Moderador
Olá Victor,
Entendi Victor.
Chegou a tentar sua sintaxe assim:
Dim Cla_Invalidas = _ From Ct In entity.PROJETOS_APONTAMENTOS_DESPESAS _ Group Join Cp In entity.PROJETOSItem.PROJETO _ On Ct.CLASSIF_FINANCEIRASItem.CLASSIF_FINANCEIRA _ Equals Cp.CLASSIF_FINANCEIRASItem.CLASSIF_FINANCEIRA Into Class_Group = Group _ Select New With _ { _ .DESCRICAO = Ct.CLASSIF_FINANCEIRASItem.DESCRICAO _ }
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique -
terça-feira, 31 de janeiro de 2012 19:01
Fernando
Na verdade, onde vc substituiu o meu metodo (query) por "entity.PROJETOSItem.PROJETO" eu não entendi, pois essa propriedade do objeto entity (objeto que representa os dados que estão sendo alterados no momento, no qual eu recebo por paramtro, não é um Collection, e sim um "inteiro", note que eu preciso verificar os dados que estão na tela (entity) confrontando com dados que foram cadastrados em outra tela, por isso eu criei o metodo (query).
Segue abaixo todo o codigo do metodo.
Private Sub PROJETOS_APONTAMENTOS_Validate(entity As PROJETOS_APONTAMENTOSItem, results As EntitySetValidationResultsBuilder) If entity.PROJETOS_APONTAMENTOS_HORAS.Count = 0 And entity.PROJETOS_APONTAMENTOS_DESPESAS.Count = 0 Then results.AddEntityError("Apotamentos sem Horas ou Depesas não são validos.") End If If entity.Total_Horas_Apontamento > 24 Then results.AddEntityError("Não é permitido apontamento de mais de 24 Horas no mesmo dia.") End If 'Dim Cla_Invalidas = _ ' From Ct In entity.PROJETOS_APONTAMENTOS_DESPESAS _ ' Group Join Cp In Projetos_Despesas_Por_Projeto(entity.PROJETOSItem.PROJETO) _ ' On Ct.CLASSIF_FINANCEIRASItem.CLASSIF_FINANCEIRA _ ' Equals Cp.CLASSIF_FINANCEIRASItem.CLASSIF_FINANCEIRA Into Class_Group = Group _ ' Select New With _ ' { _ ' .DESCRICAO = Ct.CLASSIF_FINANCEIRASItem.DESCRICAO _ ' } End Sub
-
terça-feira, 31 de janeiro de 2012 19:21Moderador
Desculpe Victor,
Acabei fazendo besteira.
Acho que me confundi mesmo com a sintaxe do VB.Net.
Uma possibilidade é vc tentar construir essa query via LinqPad (http://www.linqpad.net/) que é um aplicativo próprio para auxiliar na construção de queries com LINQ.
Ele aceita tanto a sintaxe do C# quanto a do VB.Net.
Tentei recriar sua query desta forma:
Dim Cla_Invalidas = From c In entity.PROJETOS_APONTAMENTOS_DESPESAS _ Group Join p In Projetos_Despesas_Por_Projeto(entity.PROJETOSItem.PROJETO) _ On c _ Equals p.CLASSIF_FINANCEIRASItem.CLASSIF_FINANCEIRA Into g _ from p in g.DefaultIfEmpty() _ Select DESCRICAO = p.CLASSIF_FINANCEIRASItem.DESCRICAO
Para isso, me baseei neste link: http://msdn.microsoft.com/en-us/vstudio/bb737909#lojoinMe desculpe pelo equivoco.
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique
- Editado Fernando Henrique Inocêncio Borba FerreiraMVP, Moderator terça-feira, 31 de janeiro de 2012 19:23
-
terça-feira, 31 de janeiro de 2012 19:43
Fernando
Muito obrigado pela ajuda, mas infelizmente tambem não deu certo, segue abaixo a minha ultima tentativa.
Dim Cla_Invalidas = From c In entity.PROJETOS_APONTAMENTOS_DESPESAS _ Group Join p In Projetos_Despesas_Por_Projeto(entity.PROJETOSItem.PROJETO) _ On c.CLASSIF_FINANCEIRASItem.CLASSIF_FINANCEIRA _ Equals p.CLASSIF_FINANCEIRASItem.CLASSIF_FINANCEIRA Into g() _ From p In g.DefaultIfEmpty() _ Select DESCRICAO = p.CLASSIF_FINANCEIRASItem.DESCRICAO
O que eu li é que no LS nãoé permitido que o retorno de querys sejam "desmebradas" ou convertidas para tipos que não são entity's existentes no projeto, ou seja, eu não posso obter um string, conforme acima, eu tenho que obter um objeto do tipo CLASSIF_FINANCEIRAS, porem eu não sei alterar o seu código para que isso seja possível.Victor Perez
-
terça-feira, 31 de janeiro de 2012 21:29Moderador
Olá Victor,
Para fazer isso vc deve mexer na clausula SELECT, desta forma:
Dim Cla_Invalidas = From c In entity.PROJETOS_APONTAMENTOS_DESPESAS _ Group Join p In Projetos_Despesas_Por_Projeto(entity.PROJETOSItem.PROJETO) _ On c.CLASSIF_FINANCEIRASItem.CLASSIF_FINANCEIRA _ Equals p.CLASSIF_FINANCEIRASItem.CLASSIF_FINANCEIRA Into g() _ From p In g.DefaultIfEmpty() _ Select p.CLASSIF_FINANCEIRASItemVamos ver se agora funciona :)
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique -
quarta-feira, 1 de fevereiro de 2012 16:46
Fernando
Infelizmente tambem não funcionou, mas não por culpa nossa, segue abaixo uma thread do msdn americano com a reposta para o meu problema.
Uma pena uma limitação dessas em uma ferramenta tão legal, pois o fato de o retorno das querys ter de ser de acordo com o model, até que da pra entender, pois ele é baseado em linq to Entities, mas impedir o Join ?
Segue abaixo o código que eu usei, talvez não seja a melhor maneira, mas enfim, o prazo esta apertando ....
Private Sub PROJETOS_APONTAMENTOS_Validate(entity As PROJETOS_APONTAMENTOSItem, results As EntitySetValidationResultsBuilder) If entity.PROJETOS_APONTAMENTOS_HORAS.Count = 0 And entity.PROJETOS_APONTAMENTOS_DESPESAS.Count = 0 Then results.AddEntityError("Apotamentos sem Horas ou Depesas não são validos.") End If If entity.Total_Horas_Apontamento > 24 Then results.AddEntityError("Não é permitido apontamento de mais de 24 Horas no mesmo dia.") End If Dim Cla_Invalidas = From c In Projetos_Despesas_Por_Projeto(entity.PROJETOSItem.PROJETO) Dim Classificacao_no_projeto As Boolean For Each cd In entity.PROJETOS_APONTAMENTOS_DESPESAS Classificacao_no_projeto = False For Each c As PROJETOS_DESPESASItem In Cla_Invalidas If cd.CLASSIF_FINANCEIRASItem.CLASSIF_FINANCEIRA = c.CLASSIF_FINANCEIRASItem.CLASSIF_FINANCEIRA Then Classificacao_no_projeto = True End If Next If Classificacao_no_projeto = False Then results.AddEntityError("Classificacao " & cd.CLASSIF_FINANCEIRASItem.DESCRICAO & " não valida para esse projeto.") End If Next End Sub End Class
Mesmo assim, muito obrigado pela ajuda.Victor Perez
- Marcado como Resposta VictorPerez quarta-feira, 1 de fevereiro de 2012 16:46

