EF DbContext.Set<T> filtered record only ... doesn't work

c#, entity-framework, entity-framework-4.1, repository-pattern

Solution

Your predicate is a `Func<T, bool>`, which forces the query to use the `Enumerable.Where` method instead of the `Queryable.Where` method.

Change the predicate to `Expression<Func<T, bool>>` and everything should start working.

Problem

While developing a data access solution that utilizes generic repository and unit of work pattern over entity framework 4.2. I am seeing some abnormal behavior. To make my repositories generic, I have utilized the Set method of DbContext like: ``` public class MyGenericRepository<T> { protected readonly IDbContext context; public virtual IEnumerable<T> FindBy(Func<T, bool> predicate) { return context.GetDbSet<T>().Where(predicate).First(); } } ``` where IDbContext is like: ``` public interface IDbContext { void Commit(); void Attach<T>(T obj) where T : class; void Add<T>(T obj) where T : class; DbSet<T> GetDbSet<T>() where T : class; bool Remove<T>(T item) where T : class; } ``` The DbContext class implements the IDbContext as: ``` public partial class MyEntities : IDbContext { public DbSet<T> GetDbSet<T>() where T : class { return this.Set<T>(); } } ``` When I do repository.FindBy(c => c.CompanyId == 45), Sql Profiler shows the query to NOT contain any filter (company_id = 45). The query does a Select *. Expecting a filter to be present, i started researching and came across this, http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/7d6705ac-f875-4c89-960b-842be6f6e5ed and EF DbContext.Set<T> filtered record only These threads confirms my thought process but the results are different. Any solutions? Thanks.

Original source