Что вы хотите сделать это: 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();
}
http://msdn.microsoft.com/en-us/library/bb882521(v=vs.90).aspx – MarcinJuraszek
Что мешает вам делать 'blah.Where (expression.Compile())'? – DavidG
@DavidG Это будет неэффективно. 'Compile' возвращает делегат, поэтому прогнозирование будет применяться на стороне сервера - после извлечения всех объектов из базы данных. Он спрашивал, почему бы не использовать только 'queryable.Где (выражение); ' –