目前存在ServiceStack的异步分支,可以创建异步服务.但是为了获得异步的所有好处,所有IO绑定操作都应该是异步的,因此所有数据库请求也应该是异步的.我目前正在使用OrmLite和Postgresql,因此我想知道OrmLite是否支持异步查询/操作?如果没有,其他什么.Net Micro-Orms支持异步操作?
asynchronous async-await servicestack micro-orm ormlite-servicestack
使用参数化查询似乎将参数的长度设置为传入的值的长度.
做类似的事情:
var person = Connection.Query<People>("select * from People where Name = @name",
new { name = "Fred"});
Run Code Online (Sandbox Code Playgroud)
使参数为NVARCHAR(4),因此具有不同长度的下一个查询会在缓存的计划上出现错过并创建一个新的查询.
如何更改它以便它只使用我指定的长度.
在短小精悍的你可以做一些事情:
var items = connection.Query<Items>("SELECT * FROM `@database`.`table` WHERE `id` IN @idList;", new {database = DatabaseName, idList = someList.Select(n => n.id)});
Run Code Online (Sandbox Code Playgroud)
尝试在ormlite中做同样的事情:
var items = connection.Query<Items>("SELECT * FROM {0}`.`table` WHERE `id` IN {1};", DatabaseName, someList.Select(n => n.id)});
Run Code Online (Sandbox Code Playgroud)
返回错误.Dapper创建查询:
SELECT * FROM `someDB`.`table` WHERE `id` IN (1,2,3,4);
Run Code Online (Sandbox Code Playgroud)
ormlite生成的地方:
SELECT * FROM `someDB`.`table` WHERE `id` IN [1,2,3,4];
Run Code Online (Sandbox Code Playgroud)
方括号在MySQL中无效.是不是可以在ormlite中做到这一点?
当我尝试使用匿名类列出参数时,如在dapper示例中,它找不到第二个参数.
使用IDbConnection.ExecuteSql时如何设置命令超时?
IDbConnection db = ConnectionFactory.OpenDbConnection();
db.ExecuteSql("...");
Run Code Online (Sandbox Code Playgroud)
如果我使用IDbCommand.ExecuteSql(见下文)方法,我可以设置命令超时,但我得到一堆关于弃用方法的警告.
IDbCommand comm = db.CreateCommand()
comm.CommandTimeout = 240;
comm.ExecuteSql("...");Run Code Online (Sandbox Code Playgroud) 我想知道ServiceStack.OrmLite的JoinSqlBuilder是否允许构建以下简单查询:
SELECT * FROM Table1 a
INNER JOIN Table2 b ON ...
WHERE a.Column1 = 1 AND (a.Column2 = 2 OR b.Column3 = 3);
Run Code Online (Sandbox Code Playgroud)
问题是建立(a.Column2 = 2 OR b.Column3 = 3)一部分.JoinSqlBuilder有一个方法列表,例如Where<T>, And<T>, Or<T>允许为查询添加条件.
例如,如果我这样做:
builder
.Join(...)
.Where<Table1Poco>(a => a.Column1 == 1)
.And<Table1Poco>(a => a.Column2 == 2)
.Or<Table2Poco>(a => a.Column3 == 3)
...;
Run Code Online (Sandbox Code Playgroud)
我会得到:
... WHERE a.Column1 = 1 AND a.Column2 = 2 OR b.Column3 = 3;
Run Code Online (Sandbox Code Playgroud)
有没有办法a.Column1 = 1 AND (a.Column2 = 2 OR b.Column3 …
尝试通过制作通用GET方法来减少代码中的重复.我正在使用OrmLite及其SQLExpressionVisitor更新...目标是传入lambda.我已经看过其他一些我希望会有所帮助的帖子,但到目前为止,没有去......显然问题是我如何在ev.Where声明中尝试评估标准,但解决方案正在逃避我. ..
提前谢谢...... -Lenny
public IQueryable<T> Get<T>(Predicate<T> criteria)
{
using (IDbConnection db = dbConnectionFactory.OpenDbConnection())
{
SqlExpressionVisitor<T> ev = OrmLiteConfig.DialectProvider.ExpressionVisitor<T>();
ev.Where(x => criteria.Invoke(x))
return db.Select(ev).AsQueryable();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误......从范围''引用的'TW.Api.Models.CostCenter'类型的变量'x',但它没有定义
这是一个有效但不通用的代码示例....
public IQueryable<CostCenter> Get(Identity user)
{
using (IDbConnection db = dbConnectionFactory.OpenDbConnection())
{
SqlExpressionVisitor<CostCenter> ev = OrmLiteConfig.DialectProvider.ExpressionVisitor<CostCenter>();
ev.Where(x => x.OrgId == user.OrgId);
ev.Where(x => x.VisibilityStockpointId == user.StockpointId);``
return db.Select(ev).AsQueryable();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我上面引用的模型......
[Alias("CostCenterDetail")]
public class CostCenter
{
public Guid Id { get; set; }
public Guid StockpointId { get; set; }
public virtual Guid? …Run Code Online (Sandbox Code Playgroud) 我Db在ServiceStack服务中使用该属性来访问我的数据库,但我偶尔会从IIS中收到以下错误:
Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
堆栈跟踪:
[InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.]
System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) +6371713
System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +6372046
System.Data.SqlClient.SqlConnection.Open() +300
ServiceStack.OrmLite.OrmLiteConnection.Open() +44
ServiceStack.OrmLite.OrmLiteConnectionFactory.OpenDbConnection() …Run Code Online (Sandbox Code Playgroud) 是否有一种首选方法来检测代码模型中的更改并自动重新创建数据库?我不需要迁移数据,如果有变化,我可以完全删除所有表,从模型重新创建表,并在代码中填充初始数据集的新表.
与此相关:有没有办法使用ServiceStack的ORMLite版本获取数据库中所有表的列表?
目前我正在使用我自己的班级,但如果已经有了这方面的话,我不想发明一个轮子.
Web.config文件:
<connectionStrings>
<add name="ApplicationServices"
connectionString="data source=(local);Integrated Security=SSPI;database=MyTestDatabase"
providerName="System.Data.SqlClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
DatabaseUtil:
public class DatabaseUtil
{
private const int CURR_VERSION = 1;
private static string connString = WebConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;
public static void Init(Funq.Container container)
{
using (var db = connString.OpenDbConnection())
{
using (IDbConnection dbConn = connString.OpenDbConnection())
{
var createScript = !db.TableExists(typeof(ZatabaseConfig).Name.ToString());
if (!createScript)
{
var first = dbConn.FirstOrDefault<ZatabaseConfig>("");
createScript = first == null || first.Version < CURR_VERSION;
}
if (createScript)
{
DropAndCreateDatabase(dbConn);
}
}
// db.InsertAll(SeedData);
}
}
private …Run Code Online (Sandbox Code Playgroud) 它似乎是OrmLite Select(谓词)函数,它将where子句中的所有内容(通过网络)带回来,然后在其上应用.Take(x).
我需要一种方法来只返回TOP x,这样结果更快,占用带宽更少.
有没有办法限制OrmLite select返回的TOP行(使用Linq表达式)?
我本周末第一次发现ServiceStack,我发现它非常棒.因此,我已经在将所有项目转换为它.然后我遇到了一个小障碍.
我找不到任何文档,首先从数据库开始使用OrmLite,然后将现有模式映射到POCO.
我在代码优先发现了很多材料,但在模型优先没有.
有没有办法使用OrmLiite采用模型优先方法?
谢谢.
servicestack ×6
c# ×3
async-await ×1
asynchronous ×1
dapper ×1
generics ×1
micro-orm ×1
mysql ×1
predicate ×1
sql ×1