ServiceStack с использованием Service.Db.Exists<Poco>(объект) выдает исключение при использовании с OrmLite.SqlServer

Я ожидаю что Exists<>() Функция проверит, существуют ли данные в базе данных:

if (!Service.Db.Exists<Poco.ApplicationObject>(applicationObject))
{
    Service.Db.Insert(applicationObject);
} 

но я получаю System.NotImplementedException при запуске этого кода.

В OrmLiteReadExtensions.cs:

private static bool HasChildren<T>(this IDbCommand dbCmd, object record, string sqlFilter, params object[] filterParams)
{
  string str = OrmLiteConfig.DialectProvider.ToExistStatement(typeof (T), record, sqlFilter, filterParams);
  dbCmd.CommandText = str;
  return dbCmd.ExecuteScalar() != null;
}

Это реализовано в ServiceStack.OrmLite.SqlServer?

1 ответ

Решение

Нет ToExistStatement метод не был реализован в диалекте OrmLite.SqlServer, но это, вероятно, потому что T-SQL Exists Метод применяется к подзапросам, а не для проверки существования записей, как вы хотите, и он должен избежать путаницы.

Если вы читаете провайдера диалекта, вы не найдете ToExistStatement метод.

По сути, вы ищете метод, который делает это:

ВЫБЕРИТЕ ТОП 1 id ИЗ приложенияОбъекты ГДЕ id =?;

Вы могли бы написать ToExists метод, который создает SELECT TOP 1 SQL, чтобы получить эту функциональность. Вам нужно будет создать кастом SqlServerOrmLiteDialect и скажи своему соединению, чтобы использовать его.

public class MyCustomSqlServerOrmLiteDialectProvider : SqlServerOrmLiteDialectProvider
{
    public static new MyCustomSqlServerOrmLiteDialectProvider Instance = new MyCustomSqlServerOrmLiteDialectProvider();

    public override string ToExistStatement(Type fromTableType, object objWithProperties, string sqlFilter, params object[] filterParams)
    {
        // return "SELECT TOP 1 ..."
        throw new NotImplementedException();
    }
}
Другие вопросы по тегам