Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Luciano T. Correia

Problemas com Ado Entity (Where in / or)

Recommended Posts

Ola pessoal,

 

Estou começando a desenvolver uma aplicação e estou com um problema. Não estou conseguindo fazer uma consulta no banco de dados usando o Ado Entity (Linq to Entity).

 

Deixa eu tentar exemplificar e mostrar o que estou querendo exatamente. No exemplo abaixo tem o código que estou tentando executar.

 

Links de alguns tópicos falando sobre o assunto:

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/d581eda6-5fd1-4cc5-827e-fa959a197c73

 

 

 

namespace ConsoleApplication1
{
    class Program
    {
        public static List<Empresa> empresas = new List<Empresa>();
        public static List<Cliente> clientes = new List<Cliente>();

        static void Main(string[] args)
        {
            LoadData();

            List<int> deniedAccess = new List<int>() { 1, 2 };

            // O Erro acontece aqui: no Cliente 5 a propriedade Emp é null. Alguem sabe como resolver?
            var itens = clientes.AsQueryable<Cliente>().WhereNotIn(c => c.Emp.Id, deniedAccess);
            foreach (var item in itens)
            {
                Console.WriteLine(string.Format("Nome: {0}", item.Text));
            }

            Console.ReadKey();
        }

        private static void LoadData()
        {
            empresas.Add(new Empresa() { Id = 1, Text = "Empresa 1" });
            empresas.Add(new Empresa() { Id = 2, Text = "Empresa 2" });
            empresas.Add(new Empresa() { Id = 3, Text = "Empresa 3" });
            empresas.Add(new Empresa() { Id = 4, Text = "Empresa 4" });

            clientes.Add(new Cliente() { Id = 1, Text = "Cliente 1", Emp = empresas.Find(c => c.Id == 1) });
            clientes.Add(new Cliente() { Id = 2, Text = "Cliente 2", Emp = empresas.Find(c => c.Id == 2) });
            clientes.Add(new Cliente() { Id = 3, Text = "Cliente 3", Emp = empresas.Find(c => c.Id == 3) });
            clientes.Add(new Cliente() { Id = 4, Text = "Cliente 4", Emp = empresas.Find(c => c.Id == 4) });
            clientes.Add(new Cliente() { Id = 5, Text = "Cliente 5", Emp = null });
        }

    }

    public class Empresa
    {
        public int Id { get; set; }
        public string Text { get; set; }
    }

    public class Cliente
    {
        public int Id { get; set; }
        public string Text { get; set; }
        public Empresa Emp { get; set; }

        public int EmpId { get { return Emp == null ? 0 : Emp.Id; } }
    }


    public static class Ext
    {
        #region Where Not In

        private static Expression<Func<TElement, bool>>
            GetWhereNotInExpression<TElement, TValue>(
            Expression<Func<TElement, TValue>> propertySelector,
            IEnumerable<TValue> values)
        {
            ParameterExpression p =
                propertySelector.Parameters.Single();
            

            if (!values.Any())
            {
                return e => true;
            }

            var unequals = values.Select(value =>
                (Expression)Expression.NotEqual(
                    propertySelector.Body,
                    Expression.Constant(value, typeof(TValue))
                )
            );

            var body = unequals.Aggregate<Expression>(
                (accumulate, unequal) => Expression.And(accumulate, unequal));

            return Expression.Lambda<Func<TElement, bool>>(body, p);
        }

        public static IQueryable<TElement>
            WhereNotIn<TElement, TValue>(this IQueryable<TElement> source,
            Expression<Func<TElement, TValue>> propertySelector,
            params TValue[] values)
        {
            return source.Where(GetWhereNotInExpression(
                propertySelector, values));
        }

        public static IQueryable<TElement>
            WhereNotIn<TElement, TValue>(this IQueryable<TElement> source,
            Expression<Func<TElement, TValue>> propertySelector,
            IEnumerable<TValue> values)
        {
            return source.Where(GetWhereNotInExpression(
                propertySelector, values));
        }

        #endregion

    }

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sério? nossa.. onde você descobriu esse site? você fez isso sozinho?

 

Cara, você chegou a entrar no link que eu coloquei ai? se você tivesse dado uma olhada no link deveria ter imaginado que eu já fiz essa pesquisa no google.

 

Se você não conseguiu entender nada do que eu postei ai? por favor só em não atrapalhar já ajuda muito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Luciano vamos com calma, a idéia dele foi ajudar, se não ajudou, basta um comentário como:

Opa, já olhei esse link e utilizei ele como base

 

ou

 

Não serviu!!

Caso não tenha feito ainda, leia as regras do fórum: http://forum.imasters.com.br/index.php?app=core&module=help

 

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Luciano vamos com calma, a idéia dele foi ajudar, se não ajudou, basta um comentário como:

Opa, já olhei esse link e utilizei ele como base

 

ou

 

Não serviu!!

Caso não tenha feito ainda, leia as regras do fórum: http://forum.imasters.com.br/index.php?app=core&module=help

 

Abraços...

 

Muito obrigado pela sua atenção tb.. mas discordo de você.

 

Se ele tivesse postado alguma informação ou o link de algum site? tudo bem...

 

mas o cara vem o posta o link do site do Google? fala sério. Se isso que ele fez fosse correto não precisaria de forum. Todos que perguntarem alguma coisa aqui era só responder "no google tem, procura lá".

 

De qualquer forma obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Luciano, entendo sua posição, mas de qualquer forma por mais que ele tenha postado um link sem serventia nenhuma, por ética e moral não devemos retrinuir da mesma forma.

Mas vamos lá pelo que vi em seu post você quer listar apenas clientes SEM ser das empresa 1 e 2.

 

namespace ConsoleApplication1
{
	class Program
	{
 	public static List<Empresa> empresas = new List<Empresa>();
 	public static List<Cliente> clientes = new List<Cliente>();

 	static void Main(string[] args)
 	{
 	LoadData();

 	List<int> deniedAccess = new List<int>() { 1, 2 };

 	// O Erro acontece aqui: no Cliente 5 a propriedade Emp é null. Alguem sabe como resolver?
 	var itens = clientes.Where(a => a.Emp != null && !deniedAccess.Contains(a.Emp.Id));
 	foreach (var item in itens)
 	{
 	Console.WriteLine(string.Format("Nome: {0}", item.Text));
 	}

 	Console.ReadKey();
 	}

 	private static void LoadData()
 	{
 	empresas.Add(new Empresa() { Id = 1, Text = "Empresa 1" });
 	empresas.Add(new Empresa() { Id = 2, Text = "Empresa 2" });
 	empresas.Add(new Empresa() { Id = 3, Text = "Empresa 3" });
 	empresas.Add(new Empresa() { Id = 4, Text = "Empresa 4" });

 	clientes.Add(new Cliente() { Id = 1, Text = "Cliente 1", Emp = empresas.Find(c => c.Id == 1) });
 	clientes.Add(new Cliente() { Id = 2, Text = "Cliente 2", Emp = empresas.Find(c => c.Id == 2) });
 	clientes.Add(new Cliente() { Id = 3, Text = "Cliente 3", Emp = empresas.Find(c => c.Id == 3) });
 	clientes.Add(new Cliente() { Id = 4, Text = "Cliente 4", Emp = empresas.Find(c => c.Id == 4) });
 	clientes.Add(new Cliente() { Id = 5, Text = "Cliente 5", Emp = null });
 	}

	}

	public class Empresa
	{
 	public int Id { get; set; }
 	public string Text { get; set; }
	}

	public class Cliente
	{
 	public int Id { get; set; }
 	public string Text { get; set; }
 	public Empresa Emp { get; set; }

 	public int EmpId { get { return Emp == null ? 0 : Emp.Id; } }
	}

}
e caso queira o resultado inverso altera a linha

var itens = clientes.Where(a => a.Emp != null && deniedAccess.Contains(a.Emp.Id));
Espero ter Ajudado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Luciano, entendo sua posição, mas de qualquer forma por mais que ele tenha postado um link sem serventia nenhuma, por ética e moral não devemos retrinuir da mesma forma.

Mas vamos lá pelo que vi em seu post você quer listar apenas clientes SEM ser das empresa 1 e 2.

 

namespace ConsoleApplication1
{
	class Program
	{
 	public static List<Empresa> empresas = new List<Empresa>();
 	public static List<Cliente> clientes = new List<Cliente>();

 	static void Main(string[] args)
 	{
 	LoadData();

 	List<int> deniedAccess = new List<int>() { 1, 2 };

 	// O Erro acontece aqui: no Cliente 5 a propriedade Emp é null. Alguem sabe como resolver?
 	var itens = clientes.Where(a => a.Emp != null && !deniedAccess.Contains(a.Emp.Id));
 	foreach (var item in itens)
 	{
 	Console.WriteLine(string.Format("Nome: {0}", item.Text));
 	}

 	Console.ReadKey();
 	}

 	private static void LoadData()
 	{
 	empresas.Add(new Empresa() { Id = 1, Text = "Empresa 1" });
 	empresas.Add(new Empresa() { Id = 2, Text = "Empresa 2" });
 	empresas.Add(new Empresa() { Id = 3, Text = "Empresa 3" });
 	empresas.Add(new Empresa() { Id = 4, Text = "Empresa 4" });

 	clientes.Add(new Cliente() { Id = 1, Text = "Cliente 1", Emp = empresas.Find(c => c.Id == 1) });
 	clientes.Add(new Cliente() { Id = 2, Text = "Cliente 2", Emp = empresas.Find(c => c.Id == 2) });
 	clientes.Add(new Cliente() { Id = 3, Text = "Cliente 3", Emp = empresas.Find(c => c.Id == 3) });
 	clientes.Add(new Cliente() { Id = 4, Text = "Cliente 4", Emp = empresas.Find(c => c.Id == 4) });
 	clientes.Add(new Cliente() { Id = 5, Text = "Cliente 5", Emp = null });
 	}

	}

	public class Empresa
	{
 	public int Id { get; set; }
 	public string Text { get; set; }
	}

	public class Cliente
	{
 	public int Id { get; set; }
 	public string Text { get; set; }
 	public Empresa Emp { get; set; }

 	public int EmpId { get { return Emp == null ? 0 : Emp.Id; } }
	}

}
e caso queira o resultado inverso altera a linha

var itens = clientes.Where(a => a.Emp != null && deniedAccess.Contains(a.Emp.Id));
Espero ter Ajudado!

 

 

Ivan obrigado pela sua atenção.

o código que você postou, funciona corretamente se você usar o Linq to Sql, ou esse código de exemplo que postei ai sómente para ilustrar meu problema.

 

No linq que postei mostra o problema realmente dito.

 

Esse código que você postou não é Suportado pelo Adot Entity Framework (Linq to Entity), mas especifica mente usando o Ado Data Services. É ai que está o problema. Por isso que eu estou usando aquele código louco do "WhereNotIn" que postei tb. É a única forma de fazer essa consulta usando o Ado Entity Framework. mas o problema é que o "WhereNotIn" não faz o teste se a empresa é nula, aqui que esá todo o meu problema.

 

Só pra constar, já me sugeriram fazer um "Union" dos dois resultados que eu preciso. Mas o Ado Data Service tb não suporta "Union".

 

Será que você ou alguem mais tem mais alguma ideia? esse problema está me deixando careca.. hehehehe

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.