LINQ, где предложение работает с сопоставленным объектом - PullRequest
0 голосов
/ 09 сентября 2010

Если я хочу запустить что-то вроде этого

BLL.Person person = (BLL.Person)repository.Single(item => item.Id == Id);

В моем единственном методе я бы сделал что-то вроде этого:

public Resource Single(Expression<Func<BLL.Resource, bool>> where)
{
     Resource resource = AsQueryable().FirstOrDefault(where);
     return resource;
}

protected IQueryable<BLL.Resource> AsQueryable()
{
     // I need to use the where clause on an object called DAL.Resource
     throw new NotImplementedException();
}

Объект DAL.Resource идентичен объекту BLL.Resource, однако копия BLL не знает о персистентности. Я могу без проблем сопоставить вещи с помощью automapper, чтобы вернуть коллекцию того, что я хочу, однако мне нужно предложение where запустить Agaisnt DAL не BLL ...

Это должно быть как-то возможно! Любые идеи будут оценены.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2010

Ваша подпись для условия where (Expression<Func<BLL.Resource, bool>> where) - очень хороший шаг на пути к ответу.Добавление Expression<...> говорит компилятору C # о создании дерева выражений, а не делегата для параметра where.Решение состоит в том, чтобы просмотреть дерево выражений и заменить все ссылки на ваш BLL.Person ссылками на DAL.Person.Поскольку, как вы говорите, они идентичны, вы сможете без проблем скомпилировать и запустить измененное дерево выражений для DAL.

0 голосов
/ 09 сентября 2010

Это может быть далеко от базы, но я так и делаю. В моих объектах BLL я передаю объект DAL в конструктор. В своих службах я получаю объект DAL, создаю новый объект BLL и передаю объект DAL. Затем объект BLL отображает объект DAL.

using PersonDto = DAL.IPerson;

namespace BLL
{
    public class Person : IPerson
    {

        private readonly PersonDto _person;

        public Person(PersonDto person)
        {
            _person = person;
        }

        public string Name
        {
            get { return _person.Name; }
        }
    }
}

Затем сделайте это с LINQ:

BLL.Person person = new Person(repository.Single(item => item.Id == Id));

Возможно, немного сбивает с толку, дайте мне знать, если я далеко от базы, или вам нужно больше объяснений.

...