ServiceStack или неправильный SQL?

#servicestack #ormlite-servicestack

Вопрос:

У меня есть следующий класс:

     public class ProcessInstance
    {
        [AutoIncrement]
        public int Id { get; set; }

        [Reference]
        public ProcessDefinition ProcessDefinition { get; set; }
        public int ProcessDefinitionId { get; set; }

        // and more...
}
 

Затем выполните следующее, что мне кажется прекрасным:

 var q = db.From<ProcessInstance>().Where(inst => inst.ProcessDefinition.Id == id
                amp;amp; Sql.In(inst.Status, enProcessStatus.READY, enProcessStatus.ACTIVE));
return db.Exists(q);
 

Когда я проверяю последний текст команды SQL из объекта «бд», это неправильно:

 SELECT 'exists' 
FROM "ProcessInstance"
WHERE (("Id" = @0) AND "Status" IN (@1,@2))
LIMIT 1
 

Обратите внимание , что он фильтруется Id вместо ProcessDefinition.Id , что, конечно, неправильно. Не знаю, почему он это делает-по крайней мере, я был бы признателен за ошибку, а не просто за неправильный результат.

Тем не менее, я нашел, как это исправить: Используйте ProcessDefinitionId: Where(inst => inst.ProcessDefinitionId == id дает правильный SLQ:

 SELECT 'exists' 
FROM "ProcessInstance"
WHERE (("ProcessDefinitionId" = @0) AND "Status" IN (@1,@2))
LIMIT 1
 

Почему первый не сработал? Почему нет ошибки?

Ответ №1:

ORMLite предназначен для предоставления типизированного api вокруг выражения SQL, чтобы было интуитивно понятно определять SQL, созданный на основе типизированного выражения. Он не поддерживает магическое поведение, такое как запрос любых вложенных объектов при попытке использовать свойство ссылочного сложного типа, т. Е. Вы можете запрашивать только прямые свойства столбцов, как это было сделано во 2-м запросе.

Комментарии:

1. Это совершенно нормально, что существуют ограничения, но то, что он просто сделал еще один запрос (запросил другое поле), было не так приятно и, конечно, приводит к ошибкам. Конечно, можно привести аргумент, что это человеческая ошибка, неправильное использование и т. Д., И я не возражаю, но все же было бы неплохо сделать исключение вместо создания другого SQL. Может быть, в будущем что-то улучшится.