ServiceStack с использованием Service.Db.Exists<Poco>(объект) выдает исключение при использовании с OrmLite.SqlServer
Я ожидаю что Exists<>()
Функция проверит, существуют ли данные в базе данных:
if (!Service.Db.Exists<Poco.ApplicationObject>(applicationObject))
{
Service.Db.Insert(applicationObject);
}
но я получаю System.NotImplementedException
при запуске этого кода.
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();
}
}