2010-09-09 3 views
0

Если я хочу, чтобы запустить что-то вроде этогоLINQ где предложение работает против отображенного объекта

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 not BLL ...

Это должно быть как-то! Любые идеи были бы хорошы.

ответ

0

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

+0

Привет, спасибо за ваш ответ, я начал терять всякую надежду в этом. Я посмотрю на деревья выражений и вернусь к вам, если у вас есть какие-либо ссылки или пример, я был бы благодарен. – Tablet

+0

@ 'Shahin' - попробуйте посмотреть класс' System.Linq.Expressions.ExpressionVisitor' в 'System.Core'. Это абстрактный класс для переписывания выражений. Используя Reflector.NET, я мог бы найти три производные реализации, чтобы надеяться дать вам представление о том, как их использовать. Вам нужно будет использовать Reflector, чтобы сбрасывать исходный код, потому что он является внутренним. Удачи! – Enigmativity

0

Это может быть далеко от базы, но это то, как я это делаю. В моих объектах 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)); 

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

+0

Привет, я не могу реализовать интерфейс для этих двух с текущим планом! Это сопоставление двух объектов linq, где клаузулы вместе, это то, что вы делаете? – Tablet

+0

Мое решение использует предложение where в DAL, а затем сопоставляет объект DAL с бизнес-объектом. Вы говорите, что хотите сделать «BLL.Person.Where (x => x.Id == id)» и посмотреть, где искать объект DAL, а не объект BLL? – Martin

+0

Да, вот что я пытаюсь сделать ... Я собирался ответить «да», но это заставило меня ввести больше персонажей! – Tablet

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