有没有办法对检索所有结果的 Ormlite 查询的结果进行分页。从这里的另一篇文章中,我发现了以下内容:
var result = db.Select<Group>( q => q.Where(predicate).Limit(skip:5, rows:10 ));
Run Code Online (Sandbox Code Playgroud)
但是,我想在没有“Where”子句的情况下进行查询。当省略这一段代码时,Limit 方法不再可用。如此有效,我想做的是这样的:
var result = db.Select<Group>().Limit(skip:5, rows:10);
Run Code Online (Sandbox Code Playgroud)
也许 Select 不是检索所有记录的正确方法?
我正在尝试使用新的.WithSqlFilter()扩展方法将“WITH (NOEXPAND)”提示添加到针对我的索引视图生成的 select 语句中。但是,输出 SQL 将提示放在 WHERE 子句之后,而不是 FROM 子句之后。我的客户 DTO 也有[Alias("CustomerInfo")]. 这是预期的行为还是错误地生成了 SQL?
var customer = db.From<Customer>()
.Where(ci => ci.CustomerId == customerCode)
.WithSqlFilter(sql => IsSqlServer(db) ? sql + " WITH (NOEXPAND)" : sql);
return db.Single(customer);
Run Code Online (Sandbox Code Playgroud)
编辑:我需要 IsSqlServer 方法,因为我还有单元测试和其他使用 Sqlite 而不是 SQL Server 的代码,并且需要能够忽略基于连接的提示。
private bool IsSqlServer(IDbConnection db)
{
var dialect = db.GetDialectProvider();
return dialect is ServiceStack.OrmLite.SqlServer.SqlServerOrmLiteDialectProvider ||
dialect is ServiceStack.OrmLite.SqlServer.SqlServer2012OrmLiteDialectProvider ||
dialect is ServiceStack.OrmLite.SqlServer.SqlServer2014OrmLiteDialectProvider ||
dialect is ServiceStack.OrmLite.SqlServer.SqlServer2016OrmLiteDialectProvider;
}
Run Code Online (Sandbox Code Playgroud)
生成的SQL:
SELECT TOP 1 "CustomerId", "FirstName", …Run Code Online (Sandbox Code Playgroud) 我正在努力做到以下几点:
var routines = con.Select<Table>(con.From<Table>().OrderBy(p => p.Field1).ThenBy(i => i.Field2));
Run Code Online (Sandbox Code Playgroud)
以上工作完美。但我想要一种更通用的方法并解析像 sort="field1,field2" 这样的字符串。我有以下代码:
int sortFieldCount = 0;
var itemsq = con.From<Table>();
foreach (var name in orderByField.Split(',')) {
if(sortFieldCount == 0)
itemsq = sortOrderAscending ? itemsq.OrderBy(name) : itemsq.OrderByDescending(name);
else
itemsq = sortOrderAscending ? itemsq.ThenBy(name) : itemsq.ThenByDescending(name);
sortFieldCount++;
}
Run Code Online (Sandbox Code Playgroud)
但是上面的代码似乎覆盖了第一个 OrderBy。有没有办法解决这样的问题?
谢谢
我想在OrmLite中为数据库插入或更新创建一个钩子.
假设我想CreateDate为每个插入数据库的记录写一个a,LastUpdateDate为没有数据库触发器的每个更新写一个或类似的东西.我看不出这样做,如果我打电话的方式Db.Save<Anything>(anyList)与anyList包含新增和更改的对象.
我知道NHibernate确实提供了拦截器,以便在每个对象被持久化之前为其注入自定义逻辑.有没有办法在ServiceStack.OrmLite中实现这一点?
我最近将ServiceStack软件包升级到v4.0.46(从v4.0.36开始),我们的应用程序中有一些区域使用ResolveService来调用数据库事务中的另一个服务.以前这一切都运行良好,但升级到v4.0.46后,我们收到此错误:
连接必须有效且开放
调用者看起来像这样:
public class DeleteItemService: CustomerServiceBase
{
public object Post(DeleteItem request)
{
WriteDb(conn => {
using (var service = ResolveService<DeleteDocumentsService>()) {
service.Post(new DeleteDocumentsRequest {
Ids = ids.ToArray()
});
}
conn.Delete<Item>(request.Id);
});
return RespondSuccess<ResponseBase>();
}
}
Run Code Online (Sandbox Code Playgroud)
DeleteDocumentsService看起来有点像这样
public class DeleteDocumentsService: CustomerServiceBase
{
public ILog Log { get; set; }
public PrivateStorage PMStorage { get; set; }
public ResponseBase Post(DeleteDocumentsRequest request)
{
WriteDb(conn => {
var link = conn.Select<DocumentLink>(l => l.DocumentStorageId == item.Id).FirstOrDefault();
conn.Delete<DocumentStorage>(item.Id);
});
return RespondSuccess<ResponseBase>();
}
Run Code Online (Sandbox Code Playgroud)
WriteDb只是数据库事务的包装器,如下所示:
public void …Run Code Online (Sandbox Code Playgroud) 我想在ServiceStack ormlite中使用paraemeters执行SQL语句
String.Format("SELECT OBJECT_ID(@name)", name);
Run Code Online (Sandbox Code Playgroud)
我想要最好的方式.
我正在使用ServiceStack.Ormlite v3.9.71并拥有以下代码段,我在其中打开 Ormlite SQLite 事务,假设我想在代码中其他地方的命令中使用此事务:
var connFactory = new OrmLiteConnectionFactory("ConnectionString", SqliteOrmLiteDialectProvider.Instance)
using (IDbConnection db = connFactory.Open()) // using var doesn't make a difference
using (IDbTransaction tran = db.OpenTransaction()) // using var or even db.BeginTransaction() doesn't make a difference
{
// I do lots of boring stuff
...
// Somewhere else in the code
using (var cmd = db.CreateCommand())
{
cmd.Transaction = tran; // get an error
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,我得到:
A first chance exception of type 'System.InvalidCastException' occurred in …Run Code Online (Sandbox Code Playgroud) 我需要从此类“tblAccounts”和“AccountNumber”的数据注释中返回别名。它使用 ServiceStack ORM Lite。
[Alias("tblAccounts")]
[Schema("task")]
public class Account : IHasId<int>
{
[Alias("AccountNumber")]
public int Id { get; set; }
[Required]
public int UnitId { get; set; }
[Required]
public int OldAccountNumber { get; set; }
[Required]
}
Run Code Online (Sandbox Code Playgroud) 我的网络服务的一个子任务是在数据库中保存文件(以及一些元数据)。
Web服务基于ServiceStack及其ORMlite版本。
所以我创建了一个代表数据库中附件的小类:
public class Attachment {
public string Description { get; set; }
public string FileName { get; set; }
public string Type { get; set; }
public byte[] Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是实际文件
MemoryStream ms = new MemoryStream(webclient.DownloadData(...));
byte[] data = new byte[...];
ms.Read(data, 0, data.Length);
Attachment file = new Attachment() {
/* all the other stuff */
Data = data
};
Run Code Online (Sandbox Code Playgroud)
直到现在都没有问题... :)
现在我拥有了将这个文件放入数据库所需的一切。所以让我们开始吧......
dbCmd.Insert<Attachment>(file);
Run Code Online (Sandbox Code Playgroud)
还有问题...
SqlException: "Operand type …Run Code Online (Sandbox Code Playgroud)