Преобразовать базовый класс выражения Linq - PullRequest
3 голосов
/ 08 февраля 2012

Я пытаюсь построить модель несвязанного домена.Моя (абстрактная) модель домена определяет сущность, например «Продукт», а затем моя конкретная реализация SQL предоставляет метод преобразования в эту сущность домена.

Например:

public interface IDomainEntity<T> where T : class
{
    T ToDomainEntity();
}

MyЗатем конкретный класс SQL реализует этот интерфейс:

public partial class Product : IDomainEntity<Domain.Product>
{
    public Domain.Product ToDomainEntity()
    {
        return new Domain.Product
        {
            ProductId = this.ProductId,
            ...
         };
    }
}

Из службы домена моего продукта я хочу предоставить общий метод фильтрации

public virtual IQueryable<T> Filter(Expression<Func<T, bool>> predicate)
{
   return GetAll().Where(predicate);
}

Где, в этом случае, Tимеет тип Домен. Продукт.У меня проблема в том, что в реализации репозитория SQL мне нужно преобразовать выражение из типа Domain.Product в тип Sql.Product, чтобы я мог использовать его в своей таблице Linq to Sql.

Возможно ливозьмите одно выражение и преобразуйте его в другое:

Expression<Func<Domain.Product, bool>>

в

Expression<Func<Sql.Product, bool>>

Заранее извиняюсь, если это не имеет смысла.

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

Даже если то, что вы хотите сделать, возможно, реальный вопрос должен быть следующим: что-нибудь получится, если вы сделаете это?

На мой взгляд, метод Filter уже один большой дырявая абстракция .Почему вход фильтра является выражением?Почему это не просто «нормальный» делегат?Единственный ответ, который приходит мне в голову, заключается в том, что это именно потому, что выражение требуется для отображения предиката из его текущей формы во что-то другое, не являющееся объектно-ориентированным.

Так что, несмотря на героические усилия,API по-прежнему выдает, что базовая реализация должна быть реляционной.Другими словами, он не так уж и отделен.

Кроме того, использование типа возврата IQueryable также проблематично по аналогичным причинам .

2 голосов
/ 08 февраля 2012

Это интересная проблема. Если бы predicate был функтором, а не выражением, перевод был бы простым, но вы бы не передавали выражение в сгенерированный SQL, который, как я понял, вам нужен (для эффективности).

Если бы у Sql.Product и Domain.Product был общий интерфейс, вы могли бы использовать это, но я понимаю, что вы не хотите идти по этому пути.

Полагаю, это оставляет либо: 1. «Вы не можете этого сделать», либо 2. «Вам нужно пройтись по дереву выражений и выполнить перевод самостоятельно». 2. может или не может быть практичным для вас.

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