Как избежать повторного проецирования кода в Entity Framework - PullRequest
5 голосов
/ 05 сентября 2010

Я пытаюсь решить проблему, аналогичную описанной здесь

Инициализация строго типизированных объектов в LINQ to Entities

только от полностью противоположное направление . У меня есть несколько функций в моем хранилище, все из которых возвращают данные идентичной формы. Вопрос в моем коде проекции:

select new pocoClass
 {
   // complex projection that is several pages long includes grabbing a graph of data
 }

на данный момент существует для каждого запроса в хранилище. Я пытался переместить его в инициализатор объекта, но это заставляет меня бояться: «В LINQ to Entities поддерживаются только конструкторы и инициализаторы без параметров». вопрос.

Я попытался разбить на два запроса

var candidates = (from thing in _entities.whatever
  where (complex.stuff==true)
  select thing);

var final = (from thing in candidates.AsEnumerable()
  let x = thing.ITEMS.Where(blah=>blah.blah==param)
  let y = x.OTHERITEMS.FirstOrDefault()
  select new pocoClass(thing,x,y);

но здесь final всегда равен null, и код в новом pocoClass никогда не вызывается. Я включил let x & y в вышеприведенное, потому что они всегда меняются в зависимости от каждого использования проекции.

Итак, мне нужно вернуться к нескольким копиям моей проекции или есть другой выход из этого?

1 Ответ

12 голосов
/ 05 сентября 2010

Я не уверен, что это полезно для вас, но я часто создаю проекционные методы, которые принимают IQueryable и возвращают IQueryable для перевода из доменного объекта в DTO.Они выглядят примерно так:

public static IQueryable<CustomerDTO> ToCustomerDTO(
    IQueryable<Customer> customers)
{
    return
        from customer in customers
        select new CustomerDTO()
        {
           ...
        };
}

Это позволяет мне иметь эту проекцию в одном месте.Из нескольких мест моего бизнес-уровня я вызываю такой метод.

Однако следует отметить несколько моментов:

  • Убедитесь, что эти методы проекции не содержат бизнес-логики.,Использование каких-либо фильтров для конкретного случая было бы плохо.
  • Иногда у вас есть DTO, который содержит сложный граф объектов, который вы хотите эффективно извлечь из базы данных в одном запросе.С небольшим творческим потенциалом это очень часто возможно, но не при возврате IQueryable.В этом случае я возвращаю массив DTO.
  • Я размещаю эти проекционные методы как статические методы внутри класса DTO.Хотя это не очень чистый дизайн, он обнаружил, что делает код очень удобным для сопровождения.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...