Tracciare:
Ho una classe implementata come facciata attorno al contesto del DB di Entity Framework. Sviluppato per mantenere la compatibilità con le versioni precedenti, imita la classe con la stessa interfaccia pubblica, ma utilizza DTO anziché entità EF.
Problema:
Ho il prossimo metodo all'interno della classe sopra descritto. Vedi il codice qui sotto:
public IQueryable<T> FindBy<T>(Expression<Func<T, Boolean>> predicate) where T : BaseDto {
//GetDestinationType takes source type of some declared mapping and returns destination type
var entityType = Mapping.Mapper.GetDestinationType(typeof (T));
var lambda = Expression.Lambda(predicate.Body, Expression.Parameter(entityType));
// dbContext declared as class field and initialized in constructor
var query = dbContext.Set(entityType).Where(lambda); // <-- Cannot use non-generic expression/lambda
return query.ProjectTo<T>(mapper.ConfigurationProvider); }
Domanda principale
È possibile filtrare EF DBSet non generico con l'aiuto dell'espressione creata in modo dinamico (predicato)
Per favore dammi qualche colla o ulteriori indicazioni se ho bisogno di usare qualche altro approccio.
Il problema è stato risolto La soluzione era abbastanza ovvia. Invece di
var query = dbContext.Set(entityType).Where(lambda);
posso scrivere
var query = dbContext
.Set(entityType)
.ProjectTo<T>(mapper.ConfigurationProvider)
.Where(predicate);
dove predicato è il parametro di input del metodo FindBy ().
Questo codice verrà compilato correttamente e, cosa più importante, EF costruirà una query ottimale al Database che includerà la clausola Where () nel corpo della query, quindi non prenderà il set completo di record dal lato DB.