一些示例代码如下 (代码是C# 3.0的, 类型推导让人少写许多类型参数, very sweet :)
/* 存储过程接口定义, 通过Attribute实现一些必要的定义 */
public interface IStoredProcedures
{
[StoredProcedure]
int Echo([Parameter("pa")]int ppaa);
[StoredProcedure]
List<BlogEntity> GetBlogs(int count);
[StoredProcedure]
void TestOut([Parameter(Size = 10)]out string oc);
}
class SampleProgram
{
static void Main(string[] args)
{
DatabaseProxy db = new DatabaseProxy("server=localhost; database=TestDB; integrated security=true");
BlogEntity entity = new BlogEntity("yep", 123);
/* 保存实体 */
db.Insert(entity);
entity.Title = "nope";
/* 更新实体 */
db.Update(entity);
/* 基本的条件和排序, 支持Expression的嵌套分析, 类似Lambda Expression, 但要轻量不少 */
BlogEntity blog = db.SelectOne<BlogEntity>(What.All, Where.Equal("CommentsCount", 123), null);
/* 删除实体 */
db.Delete(entity);
/* 返回实体列表的查询 */
List<BlogEntity> list = db.Select<BlogEntity>(What.All, Where.Between("CommentsCount", 10, 30), Order.By("Title").Desc.And("CommentsCount"));
foreach (BlogEntity b in list)
{
Console.Write(b.Title + ", " + b.CommentsCount + "\n");
}
/* 根据定义的接口, 实现存储过程 */
var procs = db.GetStoredProcedureObject<IStoredProcedures>();
/* 返回基本类型或实体 */
int ret = procs.Echo(2);
/* 返回实体列表 */
list = procs.GetBlogs(10);
string str = string.Empty;
/* 支持Output参数 */
TestOut(out str);
}
}
public interface IStoredProcedures
{
[StoredProcedure]
int Echo([Parameter("pa")]int ppaa);
[StoredProcedure]
List<BlogEntity> GetBlogs(int count);
[StoredProcedure]
void TestOut([Parameter(Size = 10)]out string oc);
}
class SampleProgram
{
static void Main(string[] args)
{
DatabaseProxy db = new DatabaseProxy("server=localhost; database=TestDB; integrated security=true");
BlogEntity entity = new BlogEntity("yep", 123);
/* 保存实体 */
db.Insert(entity);
entity.Title = "nope";
/* 更新实体 */
db.Update(entity);
/* 基本的条件和排序, 支持Expression的嵌套分析, 类似Lambda Expression, 但要轻量不少 */
BlogEntity blog = db.SelectOne<BlogEntity>(What.All, Where.Equal("CommentsCount", 123), null);
/* 删除实体 */
db.Delete(entity);
/* 返回实体列表的查询 */
List<BlogEntity> list = db.Select<BlogEntity>(What.All, Where.Between("CommentsCount", 10, 30), Order.By("Title").Desc.And("CommentsCount"));
foreach (BlogEntity b in list)
{
Console.Write(b.Title + ", " + b.CommentsCount + "\n");
}
/* 根据定义的接口, 实现存储过程 */
var procs = db.GetStoredProcedureObject<IStoredProcedures>();
/* 返回基本类型或实体 */
int ret = procs.Echo(2);
/* 返回实体列表 */
list = procs.GetBlogs(10);
string str = string.Empty;
/* 支持Output参数 */
TestOut(out str);
}
}
现在主要要做的工作想想似乎有很多:
1. 对Select功能的增强
2. 支持主外键的联合及实体继承, 组合, 连接
3. 继续优化IL生成和实现方式
4. 参数validating和exception handling
5. 数据库元数据到实体代码, 存储过程接口定义的代码生成(消除一切冗余的工作!)
别忘了, 这是个轻量, 并希望是个高效的一个ORM/数据访问组件... 不想把他弄得太复杂, 功能完全的有很多, 除了LINQ TO SQL, NBear做得也很好啊~