У меня есть ситуация, когда записи должны быть исключены в зависимости от значения в связанной таблице. При использовании объединений с SqlExpressionSelectFilter сгенерированный SQL не будет использовать псевдоним таблицы для части запроса. Я использую ServiceStack 5.5.
OrmLiteConfig.SqlExpressionSelectFilter = q => {
if (q.ModelDef.ModelType.HasInterface(typeof(IJoinFilter))) {
q.LeftJoin<IJoinFilter, FirstTable>((f, j) => f.FirstTableId == j.Id)
.Where<FirstTable>(j => j.Deleted != true);
}
};
И просто выбрав из него:
db.Select(db.From<SecondTable>().Where<SecondTable>(x => x.Id == 1));
Это генерирует что-то вроде:
SELECT SecondTable.Id, SecondTable.FirstTableId, SecondTable.Deleted
FROM SecondTable
LEFT JOIN FirstTable ON (SecondTable.FirstTableId = FirstTable.Id)
WHERE (Id = 1) AND (FirstTable.Deleted <> 1)
Обратите внимание на идентификатор в предложении where не предшествует 'SecondTable'. Существуют также случаи, когда предложение select не будет включать псевдонимы.
Поддерживаются ли объединения в выбранных фильтрах? Есть ли какой-нибудь рекомендуемый способ использовать этот тип глобального фильтра?
Я создал быстрое репродукцию здесь: https://github.com/TheScobey/OrmliteSelectFilterIssue