Потеря псевдонима таблицы при использовании объединений с SqlExpressionSelectFilter - PullRequest
2 голосов
/ 08 апреля 2019

У меня есть ситуация, когда записи должны быть исключены в зависимости от значения в связанной таблице. При использовании объединений с 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

1 Ответ

1 голос
/ 08 апреля 2019

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *запрос для включения префикса таблицы в запросы, например:

var q = db.From<SecondTable>();
q.PrefixFieldWithTableName = true;
q.Where<SecondTable>(x => x.Id == 1);
...