consulta com tabelas associativas - Entity Framework

21/08/2013

0

Boa tarde pessoal,
Estou iniciando no desenvolvimento com o entity e cair em uma situação com uma consulta no qual não

estou sabendo como trazer os dados. Estou desenvolvendo um menu dinâmico, no qual trara os itens a

depender do perfil do usuario. Eu possuo 5 tabelas: usuario, usuarioPerfil(Tabela associativa),

perfil, perfilFuncionalidade(Tabela associativa) e funcionalidade.
Eu preciso trazer as funcionalidade de um determinado usuario com determinado perfil.
Alguem teria alguma ideia de como posso fazer isso? Já tentei de varias maneiras e não consigo.
Junior_jaco

Junior_jaco

Responder

Posts

21/08/2013

Pjava

Cara, não consegui entender o que você não está conseguindo fazer com a associativa. É inserção, pesquisa, deleção, qual é realmente sus dúvida. Poderia explicar com mais detalhes?
Responder

21/08/2013

Junior_jaco

Cara estou realizando uma consulta, que me trara dados da tabela funcionalidade, porém, terá os relacionamentos dessas tabelas.
Explicando melhor, eu passarei um usuario e o menu será montado atravez do perfil deste usuario.
Responder

21/08/2013

Joel Rodrigues

Teria como postar um print do diagrama?
Se der, coloque a imagem em um servidor de compartilhamento e cole o link aqui.
Responder

22/08/2013

Junior_jaco

Teria como postar um print do diagrama?
Se der, coloque a imagem em um servidor de compartilhamento e cole o link aqui.



Segue o link com o diagrama:
http://img191.imageshack.us/img191/9855/txod.jpg
Responder

23/08/2013

Matheus Caldas

Bom dia,
Você ja tentou montar uma procedure para retornar essa consulta?

segue exemplo de um select:

select distinct f.* from funcionalidade as f
inner join perfil_funcionalidade as pf
	on pf.cod_funcionalidade = f.cod_funcionalidade
inner join perfil as p
	on p.cod_perfil = pf.cod_prefil
inner join usuario_perfil up
	on up.cod_perfil = p.cod_perfil
inner join usuario as u
	on u.cod_usuario = up.cod+usuario
where u.cod_usuario = :codigo

public IList<funcionalidade> All()
{
	IList<funcionalidade> funcionalidades = new List<funcionalidade>();
	using (SeuContexto context2 = new SeuContexto())
	{
		try
		{
			if (context2.Database.Connection.State != System.Data.ConnectionState.Open)
				context2.Database.Connection.Open();

			IDbCommand cmd = context2.Database.Connection.CreateCommand();

			cmd.CommandText = "";//Aqui sua consulta
			IDataReader dr = cmd.ExecuteReader();
			funcionalidades = popularObjeto(dr);//Aqui vc cria um metodo que le o data reader e popula o objeto;
		}
		catch (Exception ex)
		{
		}
		finally
		{
			context2.Database.Connection.Close();
		}
		return list;
	}
}
Responder

23/08/2013

Matheus Caldas

Bom dia,
Você ja tentou montar uma procedure para retornar essa consulta?

segue exemplo de um select:

select distinct f.* from funcionalidade as f
inner join perfil_funcionalidade as pf
	on pf.cod_funcionalidade = f.cod_funcionalidade
inner join perfil as p
	on p.cod_perfil = pf.cod_prefil
inner join usuario_perfil up
	on up.cod_perfil = p.cod_perfil
inner join usuario as u
	on u.cod_usuario = up.cod+usuario
where u.cod_usuario = :codigo

public IList<funcionalidade> All()
{
	IList<funcionalidade> funcionalidades = new List<funcionalidade>();
	using (SeuContexto context2 = new SeuContexto())
	{
		try
		{
			if (context2.Database.Connection.State != System.Data.ConnectionState.Open)
				context2.Database.Connection.Open();

			IDbCommand cmd = context2.Database.Connection.CreateCommand();

			cmd.CommandText = "";//Aqui sua consulta
			IDataReader dr = cmd.ExecuteReader();
			funcionalidades = popularObjeto(dr);//Aqui vc cria um metodo que le o data reader e popula o objeto;
		}
		catch (Exception ex)
		{
		}
		finally
		{
			context2.Database.Connection.Close();
		}
		return list;
	}
}
Responder

23/08/2013

Junior_jaco

Bom dia,
Você ja tentou montar uma procedure para retornar essa consulta?

segue exemplo de um select:

select distinct f.* from funcionalidade as f
inner join perfil_funcionalidade as pf
	on pf.cod_funcionalidade = f.cod_funcionalidade
inner join perfil as p
	on p.cod_perfil = pf.cod_prefil
inner join usuario_perfil up
	on up.cod_perfil = p.cod_perfil
inner join usuario as u
	on u.cod_usuario = up.cod+usuario
where u.cod_usuario = :codigo

public IList<funcionalidade> All()
{
	IList<funcionalidade> funcionalidades = new List<funcionalidade>();
	using (SeuContexto context2 = new SeuContexto())
	{
		try
		{
			if (context2.Database.Connection.State != System.Data.ConnectionState.Open)
				context2.Database.Connection.Open();

			IDbCommand cmd = context2.Database.Connection.CreateCommand();

			cmd.CommandText = "";//Aqui sua consulta
			IDataReader dr = cmd.ExecuteReader();
			funcionalidades = popularObjeto(dr);//Aqui vc cria um metodo que le o data reader e popula o objeto;
		}
		catch (Exception ex)
		{
		}
		finally
		{
			context2.Database.Connection.Close();
		}
		return list;
	}
}


Meu velho, montando o comando SQL eu consigo, mas como eu disse no titulo, estou utilizando o entity framework, esse é o problema.
Responder

23/08/2013

Matheus Caldas

Bom dia,
Você ja tentou montar uma procedure para retornar essa consulta?

segue exemplo de um select:

select distinct f.* from funcionalidade as f
inner join perfil_funcionalidade as pf
	on pf.cod_funcionalidade = f.cod_funcionalidade
inner join perfil as p
	on p.cod_perfil = pf.cod_prefil
inner join usuario_perfil up
	on up.cod_perfil = p.cod_perfil
inner join usuario as u
	on u.cod_usuario = up.cod+usuario
where u.cod_usuario = :codigo

public IList<funcionalidade> All()
{
	IList<funcionalidade> funcionalidades = new List<funcionalidade>();
	using (SeuContexto context2 = new SeuContexto())
	{
		try
		{
			if (context2.Database.Connection.State != System.Data.ConnectionState.Open)
				context2.Database.Connection.Open();

			IDbCommand cmd = context2.Database.Connection.CreateCommand();

			cmd.CommandText = "";//Aqui sua consulta
			IDataReader dr = cmd.ExecuteReader();
			funcionalidades = popularObjeto(dr);//Aqui vc cria um metodo que le o data reader e popula o objeto;
		}
		catch (Exception ex)
		{
		}
		finally
		{
			context2.Database.Connection.Close();
		}
		return list;
	}
}


Meu velho, montando o comando SQL eu consigo, mas como eu disse no titulo, estou utilizando o entity framework, esse é o problema.


Desculpe,

talvez isso ajude:

public IList<funcionalidade> FindAll(usuario user)
{
	using (SeuContexto context = new SeuContexto())
	{
		var query = from funcionalidade f in context.funcionalidade
						join perfil_funcionalidade pf in context.perfil_funcionalidade
							on pf.cod_funcionalidade = f.cod_funcionalidade
						join perfil p in context.perfil
							on p.cod_perfil = pf.cod_perfil
						join usuario_perfil up in context.usuario_perfil
							on up.cod_perfil = p.cod_perfil
						join usuario u in context.usuario
							on u.cod_usuario = up.cod_usuario
						where u.cod_usuario == user.cod_usuario
					select f;
		
		return query.ToList().GroupBy(p => p.cod_funcionalidade).Select(g => g.First());
	}
}
Responder

23/08/2013

Junior_jaco

Bom dia,
Você ja tentou montar uma procedure para retornar essa consulta?

segue exemplo de um select:

select distinct f.* from funcionalidade as f
inner join perfil_funcionalidade as pf
	on pf.cod_funcionalidade = f.cod_funcionalidade
inner join perfil as p
	on p.cod_perfil = pf.cod_prefil
inner join usuario_perfil up
	on up.cod_perfil = p.cod_perfil
inner join usuario as u
	on u.cod_usuario = up.cod+usuario
where u.cod_usuario = :codigo

public IList<funcionalidade> All()
{
	IList<funcionalidade> funcionalidades = new List<funcionalidade>();
	using (SeuContexto context2 = new SeuContexto())
	{
		try
		{
			if (context2.Database.Connection.State != System.Data.ConnectionState.Open)
				context2.Database.Connection.Open();

			IDbCommand cmd = context2.Database.Connection.CreateCommand();

			cmd.CommandText = "";//Aqui sua consulta
			IDataReader dr = cmd.ExecuteReader();
			funcionalidades = popularObjeto(dr);//Aqui vc cria um metodo que le o data reader e popula o objeto;
		}
		catch (Exception ex)
		{
		}
		finally
		{
			context2.Database.Connection.Close();
		}
		return list;
	}
}


Meu velho, montando o comando SQL eu consigo, mas como eu disse no titulo, estou utilizando o entity framework, esse é o problema.


Desculpe,

talvez isso ajude:

public IList<funcionalidade> FindAll(usuario user)
{
	using (SeuContexto context = new SeuContexto())
	{
		var query = from funcionalidade f in context.funcionalidade
						join perfil_funcionalidade pf in context.perfil_funcionalidade
							on pf.cod_funcionalidade = f.cod_funcionalidade
						join perfil p in context.perfil
							on p.cod_perfil = pf.cod_perfil
						join usuario_perfil up in context.usuario_perfil
							on up.cod_perfil = p.cod_perfil
						join usuario u in context.usuario
							on u.cod_usuario = up.cod_usuario
						where u.cod_usuario == user.cod_usuario
					select f;
		
		return query.ToList().GroupBy(p => p.cod_funcionalidade).Select(g => g.First());
	}
}


Irei testar mais tarde e te dou uma resposta Mateus, de qualquer maneira valeu cara!
Responder

11/09/2013

Junior_jaco

No meu contexto eu não consigo enxergar as tabelas de associação, como posso proceder nesse caso?


Bom dia,
Você ja tentou montar uma procedure para retornar essa consulta?

segue exemplo de um select:

select distinct f.* from funcionalidade as f
inner join perfil_funcionalidade as pf
	on pf.cod_funcionalidade = f.cod_funcionalidade
inner join perfil as p
	on p.cod_perfil = pf.cod_prefil
inner join usuario_perfil up
	on up.cod_perfil = p.cod_perfil
inner join usuario as u
	on u.cod_usuario = up.cod+usuario
where u.cod_usuario = :codigo

public IList<funcionalidade> All()
{
	IList<funcionalidade> funcionalidades = new List<funcionalidade>();
	using (SeuContexto context2 = new SeuContexto())
	{
		try
		{
			if (context2.Database.Connection.State != System.Data.ConnectionState.Open)
				context2.Database.Connection.Open();

			IDbCommand cmd = context2.Database.Connection.CreateCommand();

			cmd.CommandText = "";//Aqui sua consulta
			IDataReader dr = cmd.ExecuteReader();
			funcionalidades = popularObjeto(dr);//Aqui vc cria um metodo que le o data reader e popula o objeto;
		}
		catch (Exception ex)
		{
		}
		finally
		{
			context2.Database.Connection.Close();
		}
		return list;
	}
}


Meu velho, montando o comando SQL eu consigo, mas como eu disse no titulo, estou utilizando o entity framework, esse é o problema.


Desculpe,

talvez isso ajude:

public IList<funcionalidade> FindAll(usuario user)
{
	using (SeuContexto context = new SeuContexto())
	{
		var query = from funcionalidade f in context.funcionalidade
						join perfil_funcionalidade pf in context.perfil_funcionalidade
							on pf.cod_funcionalidade = f.cod_funcionalidade
						join perfil p in context.perfil
							on p.cod_perfil = pf.cod_perfil
						join usuario_perfil up in context.usuario_perfil
							on up.cod_perfil = p.cod_perfil
						join usuario u in context.usuario
							on u.cod_usuario = up.cod_usuario
						where u.cod_usuario == user.cod_usuario
					select f;
		
		return query.ToList().GroupBy(p => p.cod_funcionalidade).Select(g => g.First());
	}
}


Irei testar mais tarde e te dou uma resposta Mateus, de qualquer maneira valeu cara!
Responder

11/09/2013

Junior_jaco

No meu contexto eu não consigo enxergar as tabelas de associação, como posso proceder nesse caso?
Responder

11/09/2013

Matheus Caldas

boa noite,

como vc esta fazendo o mapeamento das suas entidades?
Responder

11/09/2013

Matheus Caldas

boa noite,

como vc esta fazendo o mapeamento das suas entidades?
Responder

11/09/2013

Matheus Caldas

boa noite,

como vc esta fazendo o mapeamento das suas entidades?
Responder

11/09/2013

Matheus Caldas

boa noite,

como vc esta fazendo o mapeamento das suas entidades?
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar