LINQ To Entities e o método Contains, um contorno
Olá a todos,
Depois de muito tempo, volto a escrever. Tem sido uma dura correria que me impossibilitou de dar atenção a este valioso espaço. Porém, mais uma vez, prometo tentar reservar um pouco do meu tempo para enriquecer o conteúdo desta página.
Volto hoje com um assunto que não costumo discutir aqui no blog, que é codificação.
Ultimamente tenho ocupado quase que todo o meu tempo com estudos e discussões sobre a melhor forma de codificar algo. Um problema que encontrei dias atrás foi uma limitação do LINQ To Entities, que não implementou um método mapeado para a função “IN” do SQL. Um exemplo: quero obter todos os usuários do banco cujo ID é um dos números da sequência mística do seriado LOST, que é: 4, 8, 15, 16, 23, 42. A query SQL seria:
SELECT * FROM USER U WHERE U.ID IN (4, 8, 15, 16, 23, 42)
Em tese, uma expressão LINQ para fazer a mesma coisa seria mais ou menos assim:
string[] ids = { “4″, “8″, “15″, “16″, “23″, “42″ };
var users = (from t in _db.User where ids.Contains(t.Id.ToString()) select t).ToList();
Em tempo de compilação, tudo certo. Porém, ao executar este código, você receberá esta mensagem de erro:
LINQ to Entities does not recognize the method 'Boolean Contains(Int32)'
É possível estender as bibliotecas do LINQ para mapear a função, criar uma função ultra-complicada para fazer isso, mas há uma maneira de resolver com uma linha de código, que é:
var users = _db.User.Where("it.Id IN {" + string.Join(",", ids) + "}");
Atenção para a palavra chave “it”, ela representa sua entidade na query. Logo, Id é a propriedade.
Experimente!
[]‘s
Ricardo Serradas
Erro MSB6006 em testes unitários numa Team Build
Olá a todos! Hoje vamos falar de mais um capítulo da série “Problema e solução”.
Problema:
Ao configurar uma Team Build no VSTS de um projeto que compila e que roda os testes unitários tudo certinho, a build roda, porém o status dela fica como “Partially Succeeded” porque os testes unitários falharam e, ao analisar o log, você encontra a seguinte linha no final:
MSBUILD : warning MSB6006: “MSTest.exe” exited with code 1.
O mais interessante é que se você roda os testes unitários a partir do Test List da Solution, todos funcionam, não é?
Causa:
Pois bem. Por algum motivo, o erro se dá por conta do usuário TFSSERVICE* não ter permissão na pasta onde o resultado do build foi colocado (ou “dropado”).
Solução:
Basta permitir escrita (tanto NTFS quando de compartilhamento) para pra o usuário TFSSERVICE na pasta de build drop.
*Este nome pode variar de acordo com a instalação realizada.
[]‘s
Ricardo Serradas
Erro TF53010 ao iniciar o TFSServerScheduler
Mais um erro comum depois de criar uma nova instalação do servidor do VSTS é aquele que você visualiza logo ao iniciar a máquina, dizendo algo como “Alguns serviços não puderam ser inicializados adequadamente. Consulte o visualizador de eventos…”.
Então, a primeira iniciativa que tomamos é olhar qual serviço com modo de startup automático não foi inicializado.
Chegando lá no snap-in de serviços, conferimos que o serviço “Visual Studio Team Foundation Server Task Scheduler” (TFSServerScheduler) não está inicializado. Vamos lá então: iniciamos ele manualmente e… Ele inicia! E fica lá, rodando normalmente. Mas oras, então porque ele não conseguiu subir no startup da máquina?
Consultando o Event Log, encontramos a seguinte mensagem de erro:
TF53010: The following error has occurred in a Team Foundation component or extension:
(…)
Application Domain: TFSServerScheduler.exe
(…)
Detailed Message: Unable to connect to the remote server
O que acontece?
O TFSServerScheduler depende tanto do SQL Server quanto do IIS para funcionar. Logo, se um dos dois serviços ainda não estiver devidamente inicializado, o TFSServerScheduler não vai conseguir ser inicializado também.
Como contornar isso?
Basta configurar o serviço TFSServerScheduler para ser dependente dos serviços do SQL e do IIS. Assim, ele só fará tentativas de inicialização depois que os dois serviços os quais ele depende estejam devidamente no ar. Para configurar isso, use a seguinte linha de comando no Command Prompt:
sc config TFSServerScheduler depend= W3SVC/MSSQLSERVER
Reinicie o servidor para conferir. O serviço estará devidamente inicializado.
[]‘s
Ricardo Serradas
Erro TF15003 no Event Viewer do TFS
Está aí mais um código de erro que vem incomodando logo depois de uma instalação nova e completa de um servidor do VSTS é feita. A mensagem de erro é encontrada no Visualizador de Eventos (Event Viewer) do Windows e é exatamente assim:
TF15003: The cache root specified in the fileCacheRoot configuration value must be an absolute (rooted) path. File caching will be disabled.
Isso soa falha no processo de instalação e a causa nada mais é do que a pasta que está sendo apontada como cache no arquivo de Configuração do WebService de Version Control do TFS não existir. Como conferir isso? Veja:
- Acesse a pasta de instalação do TFS e edite o arquivo Web.Config, comumente em:
C:\Program Files\Microsoft Visual Studio 2008 Team Foundation Server\Web Services\VersionControl\Web.Config
- Encontre a chave “fileCacheRoot”, dentro de “AppSettings” e confira se a pasta para a qual a chave está apontando existe. No meu caso, apontava para:
C:\Program Files\Microsoft Visual Studio 2008 Team Foundation Server\Web Services\VersionControl\Data
Se a pasta realmente não existir, basta criá-la. Após isso, reinicie os serviços e confira se a mensagem de erro aparece de novo no Event Viewer. Se não aparecer mais, pronto! Seu serviço de controle de versão voltará a trabalhar com cache.
[]’s
Ricardo Serradas
Erro MSB4019 numa Team Build
Numa instancia recém instalada do TFS 2008, onde tudo parecia estar funcionando 100%, encontrei um problema o qual percebi ter pouca referência à respeito.
Criei uma solution de testes para armazenar no Source Control, adicionei projetos, tudo tranqüilo. Depois de tudo, parti para a configuração de um Team Build.
A solução compilava normalmente na máquina client, porém, depois que subi a solução no TFS o team build falhou. Veja a mensagem de erro:
Error MSB4019: The imported project [TargetPath] was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
O erro era vinculado sempre à Web Projects (Web Application, WebService, etc). Isso ocorre porque os targets para aplicações web não estão instaladas no servidor de build.
Existem duas formas de resolver o problema. Uma delas (e a que eu aconselho) é simplesmente instalar o Visual Studio 2008 com as mínimas opções (C# e Visual Web Developer) no servidor de build. O ponto negativo desta solução é que estará consumindo espaço em disco do servidor de build.
A outra opção, se não quiser instalar o VS 2008 no servidor é a seguinte:
- Acesse: MSBuild\Microsoft\VisualStudio\v9.0\WebApplications na máquina client;
- Copie Microsoft.WebApplication.targets para o diretório da solução do projeto;
- Adicione o arquivo como parte da solução e versione-o;
- Edite o arquivo TFSBuild.proj da sua WebApplication usando um editor de texto (normalmente em [TeamProject]/TeamBuildTypes/[SolutionName]Build);
- Encontre a linha que faz o import do WebApplication Target a partir da pasta do MSBuild no Program Files:
<Import Project=”$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TeamBuild\Microsoft.TeamFoundation.Build.targets” />
E substitua por:
<Import Project=”$(SolutionDir)\Microsoft.WebApplication.targets” />
- Salve seu arquivo e suba a nova versão no TFS.
Esta solução nada mais faz do que disponibilizar o arquivo de target dentro da própria solution para que o MSBuild o busque lá dentro. O ponto negativo desta é que para cada solução que você for versionar que tiver um Web Project será necessário versionar uma cópia do arquivo de target no TFS.
Escolher a melhor opção para seu cenário é com você. Experimente!
Um abraço,
Ricardo Serradas
Erro TF30224 ao criar novo projeto no TFS 2010
Seguindo minha saga de estudos no VSTS 2010, encontrei mais um problema: o erro TF30224 ao tentar criar um novo projeto no TFS.
A mensagem de erro, depois que descobrimos a solução, é bem clara: “verifique se o servidor SQL está no ar ou se você tem permissão para acessá-lo“. Não é bem o servidor SQL, e sim o servidor de relatórios, o Report Server.
Ao acessar http://[TFSSERVER]/Reports com o TFSSETUP (usuário que usei para instalar todo o TFS) vi que não conseguia enchergar nada. Como resolver isso? Acessando a mesma URL porém autenticando-se como o Administrador local do servidor.
Pronto! Só atribuir permissão de Content Manager para o TFSSETUP (ou o usuário que está usando para criar o projeto, o seu “TFS Admin”) assim:
- Acesse http://[TFSSERVER]/Reports como orientado acima;
- Clique na aba “Propriedades”;
- Clique em “Atribuição de nova função”;
- Em “Nome do grupo ou usuário”, digite o usuário que necessita da permissão (no meu caso, [TFSSERVER]\TFSSETUP);
- Em “Função”, selecione “Content Manager” e em seguida clique em OK.
E pronto! Você conseguirá prosseguir com a criação do Team Project.
[]’s
Ricardo Serradas
Erro TF255147 ao configurar o TFS 2010
Olá pessoal,
Hoje instalando o TFS 2010 num ambiente single server me deparei com dois problemas que não estão previstos no TFSInstall.chm, que vem no DVD de instalação do TFS.
O primeiro erro foi que não há web.config em “C:\Program Files\Microsoft Team Foundation Server 10.0\Application Tier\Web Services”.
Solução: É preciso criar uma cópia do web.config.template já existente lá.
Segundo erro: Visualizado no wizard de configuração padrão do TFS. Veja:
Error [ Configuration Database ] TF255147: The following server that is running SQL Server is not listening on the expected TCP port: TFS01.

As portas necessárias já estavam liberadas, a instancia do SQL já estava rodando… O que fazer? Foi então quando me lembrei de dar uma olhada nas configurações do SQL 2008 (em Start > All Programs > Microsoft SQL Server 2008 > Configuration Tools > SQL Server Configuration Manager) e lá vi que o protocolo TCP/IP não estava habilitado (e não vem habilitado por padrão numa instalação do SQL).

O que fiz então foi habilitar o protocolo, com um duplo clique em TCP/IP e na aba Protocol, mudar a propriedade Enabled para Yes.
Feito isso, voilá! O teste de configurações rodou 100%! Mas, há um porém… Se a instalação do TFS for interrompida por algum motivo (no nosso caso, pelo SQL não estar corretamente configurado) a instalação do Sharepoint Services será corrompida. Isso é um bug conhecido do Beta1 do TFS.
Por conta disso, mãos à obra! Desinstalar todo o TFS + WSS e começar denovo. Então, dessa vez, tudo correrá bem. ![]()
Um abraço!
Ricardo Serradas
VSTS: Mais qualidade aos times de desenvolvimento
Olá a todos,
Visitei o blog do Marcos Dell Antonio e lá encontrei um posto super interessante falando sobre como o VSTS pode aumentar a produtividade/qualidade de uma equipe de desenvolvimento de software.
Gostaria de citar aqui um ponto crucial do post dele: Citação a Joel Spolsky, que criou 12 perguntas simples que, depois de respondidas, te trariam um feedback sobre seu time: ele é bom ou não é? Veja:
Segundo Joel, se pensarmos que cada “sim” dado à cada questão você colecionasse um ponto, se o seu total for acima de 10, sua equipe tem qualidade, caso contrário ela precisa e deve ser melhorada.
Concordei plenamente com o raciocínio e imagino que se um time conseguir trabalhar com cada um desses itens simultâneamente o trabalho realizado será de altíssima qualidade.
Acima, em itálico, coloquei ao lado de cada pergunta o que julgo ser a resposta mais adequada para cada questão. Claro, no post do Marcos ele encaixa de forma plena o uso do VSTS em cada uma das perguntas, o que é totalmente possível e aconselhado mas, num mundo mais “hostíl”, talvez não seja possível encorporar o trabalho dele em alguns dos itens citados nas perguntas.
E para finalizar, gostaria de deixar novamente meus parabéns ao posto do Marcos! Fantástica visão de utilização do VSTS! Abaixo, segue link do post dele. Vale muito a pena conferir na íntegra:
Um abraço!
Ricardo Serradas
Nossa! Onde faço o Unshelve?
Ultimamente tenho socorrido várias pessoas que vieram me fazer essa pergunta, ainda que para quem já está familiarizado com a ferramenta isso não seja um problema.
“Eu fiz o shelve lá conforme você recomendou só que agora não sei como recuperar as modificações do servidor! E agora, já era? As perdi? Como faz?”
Muita calma nessa hora. A solução é bem simples, porém, o problema é compreensível. O botão “Unshelve” está em localizações pouco intuitivas na IDE do Visual Studio 2008. Vamos à elas:
1 – Em “Pending Changes”: De um certo modo, concordo que umchangeset é composto de modificações pendentes de check-in, mas não são todos que pensam da mesma forma. Para grande maioria, “Pending Changes” são check-outs locais pendentes de commit paraversionamento. Concordo, afinal Shelveset é um conjunto de modificações armazenadas no Servidor, mas ainda não versionadas.
Mas voltando ao que interessa, o “Unshelve” está aqui: View -> Other Windows -> Pending Changes.

2 – Ao clicar com o botão direito em qualquer item no solution explorer. Sim, ali mesmo. Mas desde que você tenha algum projeto aberto. Não vale aquela “Solution1″ ![]()

Ah, aproveitando! Galera, vamos dar mais atenção à essa feature do VSTS. Esse tal de Shelve pode ser muito últil para você!
Um abraço,
Ricardo Serradas
Visual Studio 2010 Beta 1 Disponível
Olá,
Já está disponível para download a versão Beta 1 do Visual Studio 2010.
Os itens disponíveis são:
- Team Suite
- Team Foundation Server
- VS Professional
- .Net Framework 4.0
Para acessar, clique aqui.
Bora testar agora!!!
[]’s
Ricardo Serradas
