Возвращая пользовательские классы как IQueryable, поэтому не имеет ошибки «не поддерживается перевод в SQL» - PullRequest
0 голосов
/ 18 ноября 2009

У меня есть вызов ниже в моем репозитории, где я возвращаю IQueryable of Node (мой класс бизнес-объектов), затем у меня есть функция фильтра в моем слое сервиса, которая добавляет к вызову IQueryable и фильтрует функцию репозитория GetNodes по id. Когда я возвращаю FilterById в виде списка (чтобы он выполнялся), я получаю сообщение об ошибке - член bo.Node.Id не имеет поддерживаемого перевода в SQL. -

Есть ли способ обойти эту ошибку при возврате сгенерированного не linq класса как IQueryable?

public IQueryable<bo.Node> GetNodes()
{
       return (from item in Db.Nodes select new bo.Node(item.id, 
              item.created, item.lastupdated, item.name, 
              item.parentid, item.siteid, item.userid));
}

В моем слое обслуживания

private IQueryable<bo.Node> FilterById(IQueryable<bo.Node> source, Guid id)
{
       return source.Where(i => i.Id.Equals(id))
}

1 Ответ

2 голосов
/ 23 ноября 2009

Не используйте конструктор Node, вместо этого используйте инициализацию свойства:

return (
   from item in Db.Nodes select new bo.Node{
      item.id, item.created, item.lastupdated, item.name, 
      item.parentid, item.siteid, item.userid
   });

afaik, используя конструктор, вы не предоставляете никакой информации в выражении того, какие свойства соответствуют другим. Кроме того, результирующий экземпляр основан на любой логике в конструкторе, поэтому нет никаких допустимых предположений, которые может сделать linq в отношении этих ... кроме как просто вызвать конструктор при его возврате.

...