Разработка вокруг вложенных запросов, которые выдают «Нет поддерживаемого перевода в SQL» для итогов счета - PullRequest
1 голос
/ 02 ноября 2010

У меня есть таблица счетов.Мой сервисный уровень знает, как рассчитать счет-фактуру Total для одного счета-фактуры, но если я хочу отфильтровать набор счетов-фактур по Total, запрос LINQ не будет выполнен, так как существует «Нет поддерживаемых переводов в SQL».Это происходит потому, что вложенный запрос не может быть выполнен для каждой записи счета.Как правильно обойти это?

Каждый счет Total определяется суммированием рассчитанных итоговых строк из таблицы InvoiceLines, которые включают скидки, буквально:

public decimal Total
{
    get
    {
        return Lines.Sum(l => l.LineTotal); // Lines provided by repository
    }
}

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

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

Ответы [ 2 ]

0 голосов
/ 22 ноября 2010

Решено:

  1. Добавлено кэшированное итоговое значение в моей модели, которое я могу либо установить (тем самым кэшируя его), либо рассчитать общее значение из ленивых элементов модели.В моей базе данных добавлено представление для расчета суммы, которая является дублированием логики, уже существующей в моей бизнес-логике.Но это работает.
  2. Свяжите общее значение представления с моей моделью, установив общее значение в кэше.

Теперь я могу отфильтровать данные по итоговым значениям, которые рассчитываются базой данныхкешируется в моих моделях.

0 голосов
/ 02 ноября 2010

Является ли Total добавленным свойством для объекта LINQ?Если это так, вы не можете использовать свойство Total;это специально не поддерживается.Трудно поместить многократно использованную логику в одном месте в запросе LINQ, который идет к базе данных ... Если вы делаете корневой запрос, то выполните дополнительную задачу после выполнения запроса (что можно легко сделать с помощью ToList ())вся обработка после этого будет выполняться с помощью LINQ to Objects, и вы сможете делать все, что захотите.

HTH.

...