2014-10-18 2 views
-1

У меня есть класс, который работает как какой-то репозиторий и предоставляет доступ к базе данных. Я пытаюсь настроить его, чтобы разрешать запросы с выражениями.Как читать содержимое Expression?

Итак, я хочу, чтобы быть в состоянии сделать это:

IList<MyClass> myList = myRepository.GetBy(x => x.Name == "SomeName"); 
//and... 
IList<MyClass> myList2 = myRepository.GetBy(x => x.Name == "SomeName" && x.ID = 5); 

Это то, что мне нужно иметь на функцию хранилища:

public IList<T> GetBy(Expression<Func<T, bool>> expression) 
{ 
    //Set up the query, etc 
    //I'm at the WHERE clause, and I need to get the property(ies) name(s) of the expression and their values to properly set the WHERE 
} 

Как я могу это сделать?

+4

http://msdn.microsoft.com/en-us/library/bb882521(v=vs.90).aspx – MarcinJuraszek

+0

Что мешает вам делать 'blah.Where (expression.Compile())'? – DavidG

+0

@DavidG Это будет неэффективно. 'Compile' возвращает делегат, поэтому прогнозирование будет применяться на стороне сервера - после извлечения всех объектов из базы данных. Он спрашивал, почему бы не использовать только 'queryable.Где (выражение); ' –

ответ

-1

Если я правильно понимаю ваш вопрос, вы shoul наследуете интерфейсы репозитория от базового базового интерфейса репозитория.

public interface IRepositoryBase<TEntity> 
{ 
    IList<TEntity> GetBy(Expression<Func<TEntity, bool>> expression) 
} 

и реализация хранилища от реализации базового хранилища

public abstract class RepositoryBase<TEntity>: IRepositoryBase<TEntity> 
{ 
    public MyEntities EntitiesContext { get; set; } 

    public IList<TEntity> GetBy(Expression<Func<TEntity, bool>> expression) 
    { 
     return EntitiesContext.Set<TEntity>().Where(filter).ToList() 
    } 
} 
+0

Если у него уже есть поставщик запросов, ему не нужно ничего * ничего *. Весь этот вопрос состоит в том, что у него нет поставщика запросов для данного источника данных. – Servy

1

Что вы хотите сделать это: IList <MyClass> myList2 = myRepository.GetBy (x => x.Name == "SomeName" && x.ID = 5); Это правда, что вы можете представлять x => x.Name == "SomeName" && x.ID = 5 with Expression <Func <T, bool >>

, но также и то, что вы можете сделать с делегатом Func <T, bool>.

Независимо от того, которые должны были принимать данные всегда будут из IEnumerable <T>, так что вы всегда будете иметь метод Where (всякий раз, когда вы используете пространство имен System.Linq), который принимает в качестве параметра делегат Func <T, bool>. Если объект IEnumerable <T> является DbSet <T>, это позаботится о преобразовании делегата Func <T, bool> в sql-запросе. Помните, что запрос Linq, который используется, выполняется только тогда, когда данные запроса используются или согласуются с методами ToList() или ToArray(), например.

пример: IEnumerable <MyClass> list = ... где бы вы получить данные даже от DbSet из EntityFramework

var query = list.Where (x => x.Name == "SomeName" && x.ID = 5); 

запрос является shost запрос, он не содержит никаких данных, пока это не будет сделано

foreach (var x in list) is being consumed, so the query is executed 
{ 
   var c = x.Name; 
} 

или это

`var temp = query.ToList();` 

Эта сила для хранения в a List <MyClass> Со всем этим я хочу сказать, что если вы используете DbSet EntityFramework, то происходит то, что делегат Func <T, bool> преобразуется в sql-запрос, так что диспетчер данных отвечает за фильтрацию данных (как и должно быть). От одного этого вы должны просто иметь свой метод

public IList <T> GetBy (Func <T, bool> expression) 
{ 
    origen.Where (expression).ToList(); 
} 
Смежные вопросы