Ho un codice molto semplice di ciò che sto cercando di ottenere qui.
Fondamentalmente l'idea sarebbe di essere in grado di fare un semplice FindBy(x => x.<the_column_name>, <the value>);
quindi non dovrei copiare e incollare la stessa query cambiando solo il nome della colonna.
Per ora continuo a ricevere un'eccezione da LINQ che dice che LINQ to Entities does not recognize the method 'System.String Invoke(Spunky.Entities.User)' method, and this method cannot be translated into a store expression
È possibile qualcosa? O forse non siamo ancora lì con EF 6.1?
public class UsersRepository
{
private Lazy<IDataContext> context;
public UsersRepository()
: this(() => new DataContext())
{
}
public UsersRepository(Func<IDataContext> context)
{
this.context = new Lazy<IDataContext>(context);
}
public IQueryable<User> Find(int id)
{
return FindBy(u => u.Id, id);
}
public IQueryable<User> Find(string username)
{
return FindBy(u => u.Username, username);
}
public IQueryable<User> FindBy<T>(Func<User, T> property, T value)
{
return context.Value
.Users
.Where(u => property.Invoke(u).Equals(value));
}
}
Se cambi la firma
IQueryable<User> FindBy(Expression<Func<User, bool>> predicate)
{
return context.Users.Where(predicate);
}
Puoi chiamare
return FindBy(u => u.Username == username);
Il codice cambia raramente, ma non è necessario produrre espressioni.
Devi inserire un'espressione (non una Func
) perché le espressioni possono essere tradotte in SQL. Un Func
è solo un delegato .Net, per il quale non esiste alcun equivalente SQL.