consulta com tabelas associativas - Entity Framework

21/08/2013

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

Respostas

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 Citar

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 Citar

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 Citar

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 Citar

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 Citar

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 Citar

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 Citar

23/08/2013

Matheus Caldas

[quote]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.[/quote]

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 Citar

23/08/2013

Junior_jaco

[quote][quote]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.[/quote]

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());
	}
}
[/quote]

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

11/09/2013

Junior_jaco

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


[quote][quote][quote]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.[/quote]

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());
	}
}
[/quote]

Irei testar mais tarde e te dou uma resposta Mateus, de qualquer maneira valeu cara![/quote]
Responder Citar

11/09/2013

Junior_jaco

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

11/09/2013

Matheus Caldas

boa noite,

como vc esta fazendo o mapeamento das suas entidades?
Responder Citar

11/09/2013

Matheus Caldas

boa noite,

como vc esta fazendo o mapeamento das suas entidades?
Responder Citar

11/09/2013

Matheus Caldas

boa noite,

como vc esta fazendo o mapeamento das suas entidades?
Responder Citar

11/09/2013

Matheus Caldas

boa noite,

como vc esta fazendo o mapeamento das suas entidades?
Responder Citar