我最近开始使用ServiceStack及其ORMLite框架.我在谷歌搜索并浏览了源代码,但找不到任何相关内容.
在使用ORMLite执行查询时,有没有办法选择特定列?像这样的东西:Db.First<Model>(q => q.Id == someId, "Column1, Column2")
除非我错过了这个功能,否则我很惊讶之前没有人问过这个问题,因为这是优化数据库事务的一个规则.
我是LINQ和OrmLite/MySql的新手.我有一个服务请求参数,需要导致where子句:
`Name` LIKE '%something%' OR `Name` LIKE '%something%else%'
Run Code Online (Sandbox Code Playgroud)
我知道我可以创建一个IN()或一个=条款,通过:
ev.Where(rn => Sql.In(rn.Name, request.Name)); // Assuming an array here
ev.Where(rn => rn.Name== request.Name));
Run Code Online (Sandbox Code Playgroud)
但我似乎无法找到一个让我建立起来的结构LIKE.另外,Name实际上是一个别名,所以我试图避免手动构造where子句.
我正在尝试使用ORMLite实现Repository模式.我最初开始时:
public List<Todo> GetByIds(long[] ids)
{
using (IDbConnection dbConn = dbFactory.OpenDbConnection())
{
return dbConn.Ids<Todo>(ids).ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
但是在我的存储库中的每个方法下都有这个似乎有点重复?所以我创建了一个数据上下文类,我的所有存储库都继承自:
public class TodoRepository : DataContext
Run Code Online (Sandbox Code Playgroud)
这是DataContext班级:
public class DataContext
{
protected OrmLiteConnectionFactory dbFactory = new
OrmLiteConnectionFactory(ConfigurationManager.ConnectionStrings["AppDb"].
ConnectionString, SqlServerOrmLiteDialectProvider.Instance);
protected IDbConnection dbConn;
public DataContext()
{
dbConn = dbFactory.OpenDbConnection();
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我只需要在我的方法中执行此操作:
public List<Todo> GetByIds(long[] ids)
{
return dbConn.Ids<Todo>(ids).ToList();
}
Run Code Online (Sandbox Code Playgroud)
我很好奇这是一个很好的设计模式,以及在使用Repository模式进行ORMLite数据访问时还有其他的设计模式.
design-patterns repository-pattern servicestack ormlite-servicestack
ServiceStack ORMLite很棒,我通常避免使用ORM心态,而是更喜欢构建数据库,因为构建数据库而不是1:1类模型是有意义的.也就是说,有几件事我似乎遇到了困难,我确信这只是我无知的光芒.
第一:
有没有办法使用ORMLite管理多个结果集?我知道可以使用Dapper使用QueryMultiple方法,但无论出于何种原因,我都有时间搞清楚如何使用ServiceStack的内置Dapper实现.
第二:
有没有办法使用ORMLite在存储过程调用中返回输出参数?
理想情况下,我想避开MARS和输出参数,理想情况下我想生活在一个理想的世界:)
我正在使用.NET framework 4.5,SQL Server 2008 R2和ServiceStack 3.9.46.
stored-procedures sql-server-mars servicestack dapper ormlite-servicestack
我正在使用ServiceStack.OrmLite将数据保存在SQLite数据库中,并且到目前为止对此非常满意.
但是,我的许多对象都具有复杂类型的属性,我不想将其序列化使用JSV.
我需要能够指定应该用于在数据库中存储属性的自定义序列化/反序列化(作为字符串).在db4o世界上,这相当于使用由提供的翻译功能IObjectConstructor.
无法正确序列化和反序列化的复杂类型的一个很好的例子是NodaTime类型,即使它们可以很容易地映射到字符串(我已经拥有了我使用的序列化/反序列化函数db4o).
实现这一目标的最简单方法是什么?包装器不是很方便,因为我必须为包含这种复杂类型属性的每种类型编写和维护一个包装器.
c# servicestack nodatime ormlite-servicestack servicestack-text
由于我的错误消息:
An exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll but was not handled in user code
Additional information: Conversion failed when converting the nvarchar value 'AB' to data type int.
Run Code Online (Sandbox Code Playgroud)
我有一个带有AB值的枚举,我想将其保存为整数而不是nvarchar值.我有一个带有flags属性的枚举类似于:[Flags]
public enum VisibleDayOfWeek : int
{
None = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 4,
Thursday = 8,
Friday = 16,
Saturday = 32,
Sunday = 64
}
Run Code Online (Sandbox Code Playgroud)
我无法在数据库中保存多天字符串,但我可以保存代表多天的标志值的总和.
我不想在这些枚举属性周围创建一个整数包装器.
枚举的基础类型是字节或整数,那么为什么它保存为字符串/ varchar?这是没有意义的.甚至实体框架在多年后的枚举支持下也是正确的......
这种情况下的解决方案是什么?
似乎这家伙有同样的问题:https://github.com/tapmantwo/enumflags
使用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) 我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) 它似乎是OrmLite Select(谓词)函数,它将where子句中的所有内容(通过网络)带回来,然后在其上应用.Take(x).
我需要一种方法来只返回TOP x,这样结果更快,占用带宽更少.
有没有办法限制OrmLite select返回的TOP行(使用Linq表达式)?
我正在使用以下代码向我的SQLite db文件编写自定义PRAGMA:
using (var db = GetNewConnection())
{
var version = "1234";
var query = string.Format("PRAGMA user_version={0}", version);
db.ExecuteSql(query);
}
Run Code Online (Sandbox Code Playgroud)
哪个成功地将PRAGMA写入文件,我可以通过执行以下命令使用SQLite Expert或LINQPad来检查:
PRAGMA user_version
Run Code Online (Sandbox Code Playgroud)
但是如何使用OrmLite v3.9.71从DB文件中读取PRAGMA的值?
我已经尝试过以下但它无法解析SQL,因为它无法找到"FROM":
db.Select<object>("PRAGMA user_version");
Run Code Online (Sandbox Code Playgroud)
我也试过以下,没有一个工作:
db.Select<dynamic>("PRAGMA user_version");
db.Select<string>("PRAGMA user_version");
db.Select<int>("PRAGMA user_version");
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?