2009-03-04 4 views
4

Я использую аналогичный подход для других, поддерживая объекты LINQ в моем поставщике данных LINQ и возвращаю IQueryable, чтобы разрешить фильтрацию и т. Д. Это отлично подходит для фильтрации простого объекта по его идентификатору или другому недвижимость, но у меня возникли проблемы с присоединением объекта таблицы, которая состоит из других дочерних объектовLINQ to SQL DTO и составные объекты

//CoreDBDataContext db = coreDB; 
public IQueryable<DTO.Position> GetPositions() { 
    return from p in coreDB.Positions 
     select new DTO.Position 
      { 
      DTO.User = new DTO.User(p.User.id,p.User.username, p.User.firstName,p.User.lastName,p.User.email,p.User.isActive), 
      DTO.Role = new DTO.Role(p.Role.id, p.Role.name, p.Role.isActive), 
      DTO.OrgUnit = new DTO.OrgUnit(p.OrgUnit.id,p.OrgUnit.name,p.OrgUnit.isActive) 
      }; 

в coreDB.Positions моя Linq позиции объект и я возвращающая позиции DTO, который состоит из пользователя, OrgUnit и Role (базовая таблица - таблица соединений с идентификаторами пользователя, RoleID и OrgUnitID)

Проблема, с которой я столкнулся S, что, когда я пытаюсь добавить фильтр на IQueryable я получаю SQL ошибка о том, что нет перевода для моего объекта DTO.User

public static IQueryable<Position> WithUserID(this IQueryable<Position> query, int userID) 
    { 
     return query.Where(p => p.User.ID == userID); 
    } 

Я в полной растерянности относительно того, как идти о решении это, поскольку все мои результаты Google, похоже, связаны с людьми, которые работают напрямую с созданными объектами LINQ.

Любые мысли о том, как сделать эту работу, или я делаю что-то совершенно неправильно здесь?

Благодаря

ответ

1

Я не использовал фильтры для своих сложных запросов. Вместо этого я добавил методы в репозиторий для более сложных запросов. Я чувствую, что это упростит понимание системы и, следовательно, поддержит ее.

1

Linq2SQL делает только понять дизайнерские объекты созданные. Ну, это не совсем так, но достаточно близко.

Итак, когда вы пишете запросы Linq с объектами Linq2SQL, запрос будет преобразован в действительный SQL, когда запрос будет выполнен, а не когда он будет написан. Поскольку ваши объекты DTO не являются объектами Linq2SQL, Linq2SQL не будет знать, как создать правильный SQL.

Если вы хотите сохранить свое разделение таким образом, вам нужно найти способ выполнить ваши запросы только с объектами Linq2SQL и отображать результат только на ваши DTO.

Может быть, вы могли бы переписать метод запроса к:

Update: параметр должен быть типа Expression<>, и нет никакой необходимости возвращать IQueryable<>. Благодаря Фредди за указание.

public IEnumerable<DTO.Position> FindPositions(Expression<Func<Position, bool>> criteria) 
{ 
    return from p in coreDB.Positions 
      where criteria.Invoke(p) 
      select new DTO.Position 
         { 
          User = new DTO.User(p.User.id, p.User.username, p.User.firstName, p.User.lastName, 
             p.User.email, p.User.isActive), 
          Role = new DTO.Role(p.Role.id, p.Role.name, p.Role.isActive), 
          OrgUnit = new DTO.OrgUnit(p.OrgUnit.id, p.OrgUnit.name, p.OrgUnit.isActive) 
         }; 
} 
+0

почти, оберните Func в Expr <> – eglasius

+0

, но тогда зачем делать результат IQueryable :) – eglasius

+0

Кстати, я использовал оба подхода, см. Мой ответ :) – eglasius

1

Я был в состоянии успешно работать с подобным подходом:

var courses = from c in Map(origCourses) 
where !expiredStatuses.Contains(c.Status) 
select c; 

Где Карта имеет:

select new UserCourseListItem 
    { 
     CourseID = c.CourseID, 
     CourseName = cm.CourseName, 
     CourseType = c.CourseType.Value 
     ... 

Как о попытке его с этим типом инициализации (вместо конструкторов).

Пс. это часть рабочего приложения, и expiredStatuses даже связаны с сложным выражением.

Update 1: Это похоже по сравнению с упомянутым сценарием, потому что:

  • Карта возвращается в IQueryable, который является объектом ПОК.
  • После вызова метода Map, который возвращает IQueryable с объектом POCO, я применяю к нему фильтр.
+0

Я пробовал аналогичную функцию сопоставления, но я стараюсь, чтобы мой класс репозиций данных был как можно более тонким, а затем использовал методы расширения для добавления фильтров к реализации моих данных репозиторий. У нас есть тестовый репозиторий, который просто использует список и sql-репозиции для нашего фактического кода производства – Devon

+0

Я понимаю, но я имел в виду, что это может быть связано с использованием конструктора (просто догадка). Обратите внимание, что моя карта метод возвращает IQueryable , поэтому я думаю, что ситуация с фильтром эквивалентна. – eglasius

+0

Так будет ли это извлекать все данные из хранилища данных и затем фильтровать сопоставленные объекты? – Devon

Смежные вопросы