Como você transferir a execução de uma expressão criada por um objeto IQueryable a um IEnumerable?

StackOverflow https://stackoverflow.com/questions/503208

Pergunta

No meu código eu gostaria de fazer meus repositórios IQueryable. Desta forma, os critérios de selecção será uma árvore de expressão LINQ.

Agora, se eu quero zombar meu repositório no theorie isso é muito fácil:. Basta implementar a interface do meu repositório (que também é um objeto IQueryable)

Meu implementação repositório simulada seria apenas uma na coleção de memória, mas a minha pergunta é:? Do você sabe uma maneira fácil de implementar a interface IQueryable da minha simulação, para transferir a consulta para a minha coleção-memory in (IEnumerable)

Obrigado pela sua resposta,

Alguns precisão

O objeto cliente do meu repositório usará meu repositório desta maneira:

resultado var = de entrada no MyRepository onde entry.Product == "SomeProduct" select entrada;

O que ToList ou AsEnumerable é para executar a consulta e retornar o resultado como uma lista ou como um IEnumerable. Mas eu tenho que implementar a interface IQueryable no meu repositório, com uma IQueryProvider que transforma a expressão em uma chamada para um objeto IEnumerable.

Solução

A implementação da solução é delegar chamada para IQueryable para a minha coleção InMemory com AsQueryable.

public class MockRepository : IQueryable<DomainObject>
    {
        private List<DomainObject> inMemoryList = new List<DomainObject>();

        #region IEnumerable<DomainObject> Members

        public IEnumerator<DomainObject> GetEnumerator()
        {
            return inMemoryList.GetEnumerator();
        }

        #endregion

        #region IEnumerable Members

        IEnumerator IEnumerable.GetEnumerator()
        {
            return inMemoryList.GetEnumerator();
        }

        #endregion

        #region IQueryable Members

        public Type ElementType
        {
            get
            {
                return inMemoryList.AsQueryable().ElementType;
            }
        }

        public Expression Expression
        {
            get
            {
                return inMemoryList.AsQueryable().Expression;
            }
        }

        public IQueryProvider Provider
        {
            get
            {
                return inMemoryList.AsQueryable().Provider;
            }
        }

        #endregion
    }
Foi útil?

Solução

Use AsQueryable em suas simulações. Agora eles estão queryable e você pode tratá-los como qualquer outro queryable.

Outras dicas

Você pode usar o método de extensão

.ToList<>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top