2015-09-24 10 views
7

ich aufzurufen haben eine Schnittstelle, die ein Repository aus dem Repository-Muster definiert:Wie Expression <Func <Entity, bool >> gegen eine Sammlung

interface IRepository 
{ 
    List<Customer> GetAllCustomers(Expression<Func<Customer, bool>> expression); 
} 

ich es gegen Entity Framework implementiert haben:

class EntityFrameworkRepository 
{ 
    public List<Customer> GetAllCustomers(Expression<Func<Customer, bool>> expression) 
    { 
     return DBContext.Customers.Where(expression).ToList(); 
    } 
} 

, die gut zu funktionieren scheint, erlaubt es mir, wie etwas zu tun:

var customers = entityFrameworkRepository.Where(
    customer => String.IsNullOrEmpty(customer.PhoneNumber) 
); 

Jetzt würde ich mag ein InMemo haben ryRepository für Test- und Demozwecke. Ich habe versucht, zu erstellen:

class InMemoryRepository 
{ 
    Dictionary<int, Customer> Customers {get; set;} = new Dictionary<int, Customer>(); 

    public List<Customer> GetAllCustomers(Expression<Func<Customer, bool>> expression) 
    { 
     //what do I put here? 
    } 
} 

Wie Sie im obigen Code sehen können, ich bin ratlos, was für InMemoryRepository.GetAllCustomers Umsetzung zu tun. Was soll ich tun, um die Kunden nach dem angegebenen Ausdruck zu filtern und die Ergebnisse zurückzugeben?

Ich habe versucht:

return Customers.Where(expression)); 

Aber offensichtlich es erwartet ein Func<KeyValuePair<int, Customer>, bool> so dass ich einen Kompilierungsfehler erhalten:

Error CS1929 'Dictionary' does not contain a definition for 'Where' and the best extension method overload 'Queryable.Where(IQueryable, Expression>)' requires a receiver of type 'IQueryable' DataAccess.InMemory

Antwort

8

Versuchen .AsQueryable() Methode:

return Customers.Values.AsQueryable().Where(expression); 
+0

Ich verbrachte eine Stunde damit, und Sie bekommen mich in weniger als einer Minute. Fantastisch. Eine schnelle Korrektur, es ist 'Customers.Values.AsQueryable(). Wo (Ausdruck);' – mason

+0

@ Mason ja, natürlich. froh, dass ich Helfen kann! – Backs

-1

Beispiel

Expression<Func<Products, bool>> expresionFinal = p => p.Active; 

if (mydate.HasValue) 
{ 
    Expression<Func<Products, bool>> expresionDate = p => (EntityFunctions.TruncateTime(c.CreatedDate) <= mydate); 
    expresionFinal = PredicateBuilder.And(expresionFinal, expresionDate); 
} 

IQueryable<T> query = dbSet; 


    query = query.Where(expresionFinal); 
+0

Nicht sicher, wofür du hier bist? Der Ausdruck ist bereits festgelegt, ich kann die Form nicht ändern. – mason

+0

Sie benötigen eine generische Repository wie folgt aus: 'public class GenericRepository : IGenericRepository , IDisposable where T: Klasse {interne DbContext Kontext; intern DbSet dbSet; public GenericRepository (DbContext-Kontext) { this.context = context; this.dbSet = context.Set (); } public virtual IEnumerable Get (Expression > filter = null) { IQueryable query = dbSet; query = query.Where (Filter); Rückgabe query.ToList(); } } ' – J4ime