Java中与Dapper,PetaPoco,Massive或CodingHorror等微型ORM最接近的等价物是什么?
我有一个名为Tags(Id,Name)的数据库表,我想从中选择名称与列表中的名称匹配的表.在SQL中我会使用类似的东西:
Select * from Tags Where Name In ('Name1', 'Name2', 'xxx...)
Run Code Online (Sandbox Code Playgroud)
但是现在在ASP.Net MVC3项目中使用PetaPoco,我很难搞清楚如何正确地完成它.到目前为止,我已经尝试过:
var tagsToFind = new string[] { "SqlServer", "IIS" };
var sql = PetaPoco.Sql.Builder.Select("*").From("Tags").Where("Name in (@0)", tagsToFind);
var result = db.Query<Tag>(sql);
Run Code Online (Sandbox Code Playgroud)
这导致以下SQL,其中只使用tagsToFind列表中的第一个名称来匹配表数据而不是所有表名数据.
SELECT * FROM Tags WHERE (Name in (@0)) -> @0 [String] = "SqlServer"
Run Code Online (Sandbox Code Playgroud)
这有点令人沮丧,知道这可能不是那么难......任何帮助都表示赞赏!
更新: 我发现它可以用另一种方式完成
var sql = PetaPoco.Sql.Builder.Append("Select * from tags Where Name IN (@0", tagNames[0]);
foreach (string tagName in tagNames.Where(x => x != tagNames[0])) {
sql.Append(", @0", tagName);
} …Run Code Online (Sandbox Code Playgroud) 这个查询的正确语法是什么?
var l=db.Fetch<article>("SELECT * FROM articles WHERE title LIKE '%@0%'", 'something');
Run Code Online (Sandbox Code Playgroud)
或者我应该使用CHARINDEX?
我希望能够在PetaPoco中调用带有命名参数的存储过程.
为了调用执行搜索/获取的存储过程:
我可以这样做:
return db.Fetch<Customer>("EXEC SP_FindCust",
new SqlParameter("@first_name", fName),
new SqlParameter("@last_name", lName),
new SqlParameter("@dob", dob));
Run Code Online (Sandbox Code Playgroud)
另外,如何调用插入的存储过程?
return db.Execute("EXEC InsertCust @CustID = 1, @CustName = AAA")
Run Code Online (Sandbox Code Playgroud)
谢谢,Nac
我正在使用该Save()方法来插入或更新记录,但我想让它只执行一次数据库命令来执行批量插入和批量更新.我该怎么做呢?
我正在尝试使用PetaPoco将表转换为POCO.
在我的表中,我有一个名为的列TheEnum.此列中的值是表示以下枚举的字符串:
public enum MyEnum
{
Fred,
Wilma
}
Run Code Online (Sandbox Code Playgroud)
当PetaPoco尝试将字符串"Fred"转换为MyEnum值时会发出ch咽声.
它在GetConverter方法中执行此操作,在行中:
Convert.ChangeType( src, dstType, null );
Run Code Online (Sandbox Code Playgroud)
这里src是"弗雷德"(a string),而且dstType是typeof(MyEnum).
一个例外是InvalidCastException,说Invalid cast from 'System.String' to 'MyEnum'
我错过了什么吗?我需要先注册一些东西吗?
通过在GetConverter方法中添加以下内容,我解决了这个问题:
if (dstType.IsEnum && srcType == typeof(string))
{
converter = delegate( object src )
{
return Enum.Parse( dstType, (string)src ) ;
} ;
}
Run Code Online (Sandbox Code Playgroud)
显然,我不想在每一行都运行这个委托,因为它会大大减慢速度.我可以将这个枚举及其值注册到字典中以加快速度,但在我看来,这样的东西可能已经存在于产品中.
所以,我的问题是,我是否需要做一些特殊的事情来注册PetaPoco的枚举?
2012年2月23日更新
我需要使用petapoco创建DAL和存储库.出现的困难是,我不知道它如何管理它的连接.
如果我使用的是dapper,我知道连接过程是如何流动的,因为我控制它.我不知道用petapoco创建DAL的最佳做法是什么.
public class UserRepository
{
public IEnumerable<User> All()
{
var db = new PetaPoco.Database("Sqlite_Connection");//this line
var s = db.Query<User>("SELECT * FROM Users");
return s.ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
我想将var db = new PetaPoco.Database("Sqlite_Connection");//this line
我的DALHelper类作为静态属性放置,但我担心可伸缩性
我有一个存储过程返回一个表值.
这是我的存储过程:
PROCEDURE [GetPermitPendingApproval]
@permitYear int = NULL,
AS
BEGIN
SELECT [p].[ID]
,[p].[PermitNumber]
,[p].[PermitTypeID]
,[p].[ApplicationDate]
,[u].[FirstName]
,[u].[MI]
,[u].[LastName]
,[u].[Suffix]
,[u].[ProfessionalTitle]
,[u].[WorksFor]
FROM [SciCollUser] u
INNER JOIN UserPermit up ON up.[UserID] = u.[ID]
INNER JOIN Permit p ON p.[ID] = [up].[PermitID]
WHERE (@permitYear IS NULL OR p.PermitYear = @permitYear)
ORDER BY [p].[ApplicationDate] ASC;
END
Run Code Online (Sandbox Code Playgroud)
我不确定我们是否有这样的方法来使用PetaPoco执行存储过程并将返回的数据作为表格获取?请帮忙!
通常我可以用跟随脚本执行存储过程,但这不是我想要的方式.
db.Execute("EXEC GetPermitPendingApproval @permitYear=2013");
Run Code Online (Sandbox Code Playgroud) 我正在使用PetaPoco Micro-ORM和C#4.0.
下面的代码从数据库中检索一行:
var result = db.SingleOrDefault<TdUsers>(getUserQuery);
Run Code Online (Sandbox Code Playgroud)
我想检查结果是否包含任何行,以及是否为null.做这个的最好方式是什么?
我开始使用PetaPOCO和Dapper,他们都有自己的局限性.但恰恰相反,它们比实体框架闪电般快,我倾向于放弃它的局限性.
我的问题是:是否有任何ORM可以让我们具体定义一对多,多对一和多对多的关系?Dapper.Net和PetaPOCO都可以实现破解这些关系的黑客方式,而且当你可能有5-6个连接时它们甚至不能很好地扩展.如果没有一个微型ORM可以让我们处理它,那么我的第二个问题是我应该放弃这些微ORM在定义关系方面不是那么好并为每一种类型创建一个新的POCO实体的事实我将执行的查询包括这些类型的多连接?这可以很好地扩展吗?
我希望我对自己的问题很清楚.如果没有,请告诉我.