none
Generic Method Join RRS feed

  • Pergunta

  • Hoje eu tenho a seguinte situação:

    public class Joins<TOuter, TInner, TResult>
    {
        public Expression<Func<TOuter, object>> outerKeySelector;
        public Expression<Func<TInner, object>> innerKeySelector;
        public Expression<Func<TOuter, TInner, object>> resultSelector;
    
        public IEnumerable<TResult> r;
    
    }
    
    public class Test<T>
    {
        public IEnumerable<TResult> Join<TInner, TResult>(
            Expression<Func<T, object>> outerKeySelector,
            Expression<Func<TInner, object>> innerKeySelector,
            Expression<Func<T, TInner, TResult>> resultSelector) where TInner : class
        {
            var join = new Joins<T, TInner, TResult>();
            join.innerKeySelector = innerKeySelector;
            join.outerKeySelector = outerKeySelector;
    
            return join.r;
        }
    }

    Para criar o método eu me baseei no link: MSDN

    No entanto, quando eu tento chamar o método, TInner não é reconhecido, fazendo com que o método se torne inválido me retornando o seguinte erro:

    Cannot convert expression type 'type' to return type 'TResult'

    Nota: A classe 'Join' é puramente um teste, nada disso é definitivo e a var 'r' é somente para teste, usado apenas para facilitar o retorno.

    Exemplo de uso pretendido:

    var test = new Test<User>().Join<Permission>(u => u.Id, p => p.IdUser, (u, p) => new { Id = u.Id , Area = p.Area });

    Mais detalhes:

    Como mencionado, TInner não é reconhecido, por isso não posso fazer uma chamada o método correto.

    Como um teste que eu fiz assim:

    var test = new Test<User>().Join<Permission>(u => u.Id, p => p.ToString(), (u, p) => new {Id = u.Id, Name = p.ToString()});

    Eu sei p.ToString() não é correto, mas como não está reconhecendo as propriedades da classe indicada (no caso Permission), eu coloquei ToString() apenas para terminar de escrever o método.

    Eu preciso usar o resultado em um foreach / for da seguinte maneira:

    foreach(var obj in test)
    {
        var id = obj.Id;
        var area = obj.Area;
        .
        .
        .
    }

    Alguém sabe como resolver isso?


    • Editado Eduardo Carísio quarta-feira, 13 de novembro de 2013 21:45 Correção de texto
    quarta-feira, 13 de novembro de 2013 21:43

Todas as Respostas

  • Então Eduardo Carísio o que você fez foi um método de extensão para IQueryable mas, ta errado se não seguiu a mesmo código!!!

    #Então item sem solução!!!


    Fulvio Cezar Canducci Dias

    quinta-feira, 14 de novembro de 2013 00:36