consulta aleatória com linq to sql

SQLite

29/04/2015

Ola amigos estou tentando pegar dados em ordem aleatoria usando o linq sql mas não esta dando certo abaixo o codigo q estou usando

public void testeGerarProva(string nivel, int materia, int ano, TextBox texto, int quantidade)
{
dc = new ModeloDadosDataContext();
if (nivel == "Super Fácil")
{
var pesquisa = (from questões in dc.TbQuestoesFechadas
where questões.Materia == materia && questões.Ano == ano && questões.Nivel == 1
orderby Guid.NewGuid()
select questões).Take(1);
foreach (var itens in pesquisa)
{
texto.Text = texto.Text + Environment.NewLine + itens.Enunciado.ToUpper() + Environment.NewLine + itens.Alternativas + Environment.NewLine + itens.Assunto + Environment.NewLine;

}
}
}
Alan Martins

Alan Martins

Curtidas 0

Respostas

Jothaz

Jothaz

29/04/2015

Sempre que posta trechos de códigos use a tag Code "</>", para facilitar a leitura de quem vai ajudá-lo.

public void testeGerarProva(string nivel, int materia, int ano, TextBox texto, int quantidade)
{
	dc = new ModeloDadosDataContext();
	if (nivel == "Super Fácil")
	{
		var pesquisa = (from questões in dc.TbQuestoesFechadas
		where questões.Materia == materia && questões.Ano == ano && questões.Nivel == 1
		orderby Guid.NewGuid()
		select questões).Take(1); 
		foreach (var itens in pesquisa)
		{
			texto.Text = texto.Text + Environment.NewLine + itens.Enunciado.ToUpper() + Environment.NewLine + itens.Alternativas + Environment.NewLine + itens.Assunto + Environment.NewLine;

		}
	}
}


Você precisa ser mais assertivo sobre a questão "mas não esta dando certo"! Quanto mais claro o enunciado do post mais fácil ser torna ajudá-lo!
Retorna algum erro?
Ou não executa a consulta?
Você chegou a criar um breakpoint para debugar?

Uma coisa que notei no seu código foi que em partes você faz referência a nivel como string:

public void testeGerarProva(string nivel....

if (nivel == "Super Fácil").....



E na expressão linq como int:

where questões.Materia == materia && questões.Ano == ano && questões.Nivel == 1 


Acho que ficaria melhor utilizar o parâmetro como int, passar 1 e usá-lo no if e na expressão linq.

Outro ponto você tem certeza que esta entrando no if:

if (nivel == "Super Fácil")


Lembre-se que C# é case sensitive, além do que espaços entre os termos podem gerar problema nas comparações.

E finalmente, não acho uma boa prática usar acentos nos nomes dos campos, classes e tabelas. É possível mas pode causar transtornos, então é melhor não usar.
GOSTEI 0
Alan Martins

Alan Martins

29/04/2015

Obrigado pelas dicas, não sabia dessa da tag code,
a consulta é realizada com sucesso porém não ordena em ordem aleatória, sempre vem na mesma ordem.
o que eu quero é q o resultado da consulta seja ordenado aleatoriamente e não esta acontecendo!
GOSTEI 0
Marcos P

Marcos P

29/04/2015

Alan,

Qualquer gerenciador de banco de dados seleciona um índice, mesmo que ele não exista explicitamente, para ordenar os resultados do select.

Quando você diz que o resultado está sendo gerado sempre na mesma ordem, é exatamente a aplicação de um índice interno que você está percebendo na consulta.

Qual o gerenciador de banco você está usando ?

Qual a ordem que você desejaria obter ?

Por qual critério a ordem deveria ser "aleatória" ?
GOSTEI 0
Randrade

Randrade

29/04/2015

Eu simulei um ambiente aqui, e utilizei o seu código, exceto o Where, e retornou a pesquisa aleatória. Debuge o seu texto, e verifique se o seu where está retornando mais de um item.

O código que usei como exemplo foi:

var pesquisa = (from questões in dc.TbQuestoesFechadas
orderby Guid.NewGuid()
select questões).Take(1); 
GOSTEI 0
POSTAR