У меня есть следующий метод в классе доступа к данным, который использует рамки сущности:Передача запроса GetWhere (Func <entityDTO, BOOL>) к методу слоя данных, который нуждается в (Func <entity,bool>) параметр для работы
public static IEnumerable<entityType> GetWhere(Func<entityType, bool> wherePredicate)
{
using (DataEntities db = new DataEntities())
{
var query = (wherePredicate != null)
? db.Set<entityType>().Where(wherePredicate).ToList()
: db.Set<entityType>().ToList();
return query;
}
}
Это прекрасно работает, когда я использую объекты во всех слоях ... однако я пытаюсь перейти к использованию класса DTO, и я хотел бы сделать что-то вроде следующего:
public static IEnumerable<EntityTypeDTO> GetWhere(Func<EntityTypeDTO, bool> wherePredicate)
{
//call a method here which will convert Func<EntityTypeDTO,bool> to
// Func<EntityType,bool>
using (DataEntities db = new DataEntities())
{
var query = new List<EntityType>();
if (wherePredicate == null)
{
query = db.Set<EntityType>().ToList();
}
else
{
query = (wherePredicate != null)
? db.Set<EntityType>().Where(wherePredicate).AsQueryable<EntityType>().ToList()
: db.Set<EntityType>().ToList();
}
List<EntityTypeDTO> result = new List<EntityTypeDTO>();
foreach(EntityType item in query)
{
result.Add(item.ToDTO());
}
return result;
}
}
по существу я хочу метод который преобразует Func в Func.
Я думаю, что мне нужно разбить Func в дерево выражений, а затем как-то перестроить его в entityType?
Я хочу сделать это, чтобы позволить уровню презентации просто передать запросы выражения?
У меня отсутствует что-то базовое или есть более простой шаблон проектирования, который может передавать запрос от DTO до класса доступа к данным, не зная деталей запроса?
Я попытался сделать DTO наследованием от сущности, которая тоже не работает?
Если есть лучший шаблон дизайна, что мне не хватает, я хотел бы указатель и я могу исследовать оттуда ...
Если GetProducts возвращает IQueryable, а не IEnumerable и как GetProductsInCategory и GetProductsWithinPriceRange принимают и возвращают IQueryable экземпляров затем Entity Framework будет иметь возможность принять все эту работу и превратить его в одном оператор SQL означает, что фильтрация все сделано в базе данных и НЕ в памяти в вашем уровне доступа. Когда вы фильтруете IEnumerable , тогда вы делаете это в памяти, но пока вы работаете над IQueryable , работа может быть загружена в базу данных. –
Для вашего плана B возникнут некоторые сложности при объединении ваших критериев - вы хотите, чтобы каждый из них был выражением>, а не только Func , чтобы EF мог перевести их в SQL (и не нужно делать фильтрацию всей встроенной памяти, что, вероятно, потребует вытащить гораздо больше данных из db, чем это необходимо). Вот пример кода в ответе, который я оставил по другому вопросу, который должен помочь: http://stackoverflow.com/a/37907316/3813189 –