让我们开启数据库无Linq、零sql时代(续)
第一部分 MQL
qq群:225656797
demo下载: 点此下载(既然下载,就支持该文,关注我的博客)
1.MQL概述
MQL是Moon.Orm 5.0中的全新设计,是在之前版本的革命性的升级.目的在于让我们的数据库开发打造为无Linq、零sql.它全面贴近标准sql,噪音低.原生.NET2.0支持、高性能、语法糖.多数库多数据源支持、操作便捷简单.
使用场景:1.NET 2.0; 2.觉得其他Orm性能低;3不喜欢linq;4.想更加便捷用sql
说明:一下以sqlserver为例.
2.MQL查询分类讲解
2.1 MQL的标准查询
var mm=ClassSet.
Select(ClassSet.ClassID,ClassSet.ClassName).
Where(ClassSet.ClassName.Contains("s").And(ClassSet.ClassID.BiggerThan(9)));
SELECT [Class].[ClassID],[Class].[ClassName] FROM [Class] WHERE [Class].[ClassName] LIKE @p1 AND [Class].[ClassID]>@p2
@p1=%s%
@p2=9
2.2 MQL的嵌套查询(含有Top查询:支持mysql、oracle、postgreSQL、sqlserver、sqlite)
var qiantao=ScoreSet.
SelectAll().
Where(
ScoreSet.UserID.
In(UserSet.
Select(UserSet.UserID).
Where(
UserSet.ClassID.
In(
ClassSet.
Select(ClassSet.ClassID).
Where(
ClassSet.ClassName.
Equal(c.ClassName).
And(ClassSet.ClassID.
BiggerThan(
0))
)
)
)
)
).
Top(
1);
SELECT TOP 1 [Score].* FROM [Score] WHERE [Score].[UserID] IN (SELECT [User].[UserID] FROM [User] WHERE [User].[ClassID] IN (SELECT [Class].[ClassID] FROM [Class] WHERE [Class].[ClassName]=@p1 AND [Class].[ClassID]>@p2 ) )
@p1=综合测试ClassName2
@p2=0
2.3 MQL的分组查询
var mql=ScoreSet.
Select(ScoreSet.ScoreM.
Sum().
AS(
"sum"),ScoreSet.TypeName).
Where(ScoreSet.ScoreM.BiggerThanOrEqual(100)).
GroupBy(ScoreSet.TypeName).
Having(ScoreSet.ScoreM.Sum().BiggerThan(300));
SELECT SUM([Score].[ScoreM]) AS 'sum',[Score].[TypeName] FROM [Score] WHERE [Score].[ScoreM]>=@p1 GROUP BY [Score].[TypeName] HAVING SUM([Score].[ScoreM])>@p2
@p1=100
@p2=300
2.4 MQL的连接查询
var m1=ClassSet.
Select(ClassSet.ClassID,ClassSet.ClassName)
.
LeftJoin(
UserSet.
Select(UserSet.UserID))
.
ON(ClassSet.ClassID.
Equal(UserSet.UserID))
.
Where(UserSet.UserID.
BiggerThan(
9));
SELECT [Class].[ClassID],[Class].[ClassName],[User].[UserID] FROM [Class] LEFT JOIN [User] ON [Class].[ClassID]=[User].[UserID] WHERE [User].[UserID]>@p1
@p1=9
2.5 MQL的Union查询
var mql=ClassSet.
SelectAll().
Where(ClassSet.ClassID.
BiggerThan(
1))
.
Union(ClassSet.
SelectAll().
Where(ClassSet.ClassID.
BiggerThan(
2)));
var mql=ClassSet.
SelectAll().
Where(ClassSet.ClassID.
BiggerThan(
1))
.
UnionAll(ClassSet.
SelectAll().
Where(ClassSet.ClassID.
BiggerThan(
2)));
SELECT [Class].* FROM [Class] WHERE [Class].[ClassID]>@p1 UNION SELECT [Class].* FROM [Class] WHERE [Class].[ClassID]>@p2
@p1=1
@p2=2
SELECT [Class].* FROM [Class] WHERE [Class].[ClassID]>@p1 UNION ALL SELECT [Class].* FROM [Class] WHERE [Class].[ClassID]>@p2
@p1=1
@p2=2
3.MQL查询结果预览
public
static
void
Main(
string[] args)
{
using (
var db=Db.
CreateDefaultDb()) {
db.TransactionEnabled=
true;
db.DebugEnabled=
true;
Console.
WriteLine(
"---------------嵌套查询---------------------");
var qiantao=ScoreSet.
SelectAll().
Where(
ScoreSet.UserID.
In(UserSet.
Select(UserSet.UserID).
Where(
UserSet.ClassID.
In(
ClassSet.
Select(ClassSet.ClassID).
Where(
ClassSet.ClassName.
Equal(c.ClassName).
And(ClassSet.ClassID.
BiggerThan(
0))
)
)
)
)
).
Top(
1);
Console.
WriteLine(
"---------------分组查询---------------------");
var mql=ScoreSet.
Select(ScoreSet.ScoreM.
Sum().
AS(
"sum"),ScoreSet.TypeName).
Where(ScoreSet.ScoreM.
BiggerThanOrEqual(
100)).
GroupBy(ScoreSet.TypeName).
Having(ScoreSet.ScoreM.
Sum().
BiggerThan(
300));
Console.
WriteLine(
"---------------连接查询---------------------");
var m1=ClassSet.
Select(ClassSet.ClassID,ClassSet.ClassName)
.
LeftJoin(
UserSet.
Select(UserSet.UserID))
.
ON(ClassSet.ClassID.
Equal(UserSet.UserID))
.
Where(UserSet.UserID.
BiggerThan(
9));
}
Console.WriteLine("---------------Union测试---------------------");
using (var db=Db.CreateDefaultDb()) {
db.TransactionEnabled=true;
db.DebugEnabled=true;
var mql=ClassSet.SelectAll().Where(ClassSet.ClassID.BiggerThan(1))
.Union(ClassSet.SelectAll().Where(ClassSet.ClassID.BiggerThan(2)));
}
}
1.Moon.Orm初始化说明
1.1 配置文件说明
1.1.1默认配置
<connectionStrings>
<add name="DefaultConnection"
connectionString="Server=QSC-E15014A6665\SQLEXPRESS;Database=Test;uid=sa;Password=123456;"
providerName="Moon.Orm,Moon.Orm.SqlServer
" />
</connectionStrings>
using (
var db=Db.
CreateDefaultDb()) {
}
1.1.2其它配置
(详情见:Moon.Orm 5.0 (MQL版) 配置说明)
<connectionStrings>
<add name="MyqlConnection"
connectionString="mysql连接字符串"
providerName="Mysql自定义dllName,Mysql命名空间...类名" />
</connectionStrings>
using (
var db=Db.
CreateDbByConfigName("MysqlConnection")) {
}
1.2 通过字符串直接初始化
using (
var db=
new
SqlServer(
"连接字符串") {
}
2.Moon.Orm开启事务
using (
var db=Db.
CreateDefaultDb()) {
db.TransactionEnabled=
true;
//随便写许多逻辑,一个事务都在这个{}中
}
3.Moon.Orm开启调试模式
using (
var db=Db.
CreateDefaultDb()) {
db.DebugEnabled=
true;
var mql=ScoreSet.Select(ScoreSet.ScoreM.Sum().AS("sum"),ScoreSet.TypeName).
Where(ScoreSet.ScoreM.BiggerThanOrEqual(100)).GroupBy(ScoreSet.TypeName).
Having(ScoreSet.ScoreM.Sum().BiggerThan(300));
var sql=mql.
ToDebugSQL();//可以查看当前查询语句
}
4.Moon.Orm开启缓存模式
using (
var db=Db.
CreateDefaultDb()) {
db.StartCache(秒数);//查询用的缓存
}
5.Moon.Orm添加数据
using (
var db=Db.
CreateDefaultDb()) {
db.DebugEnabled=
true;
Class c=
new
Class();
c.ClassName=
"综合测试ClassName2";
db.
Add(c);
}
6.Moon.Orm删除数据
using (
var db=Db.
CreateDefaultDb()) {
db.DebugEnabled=
true;
db.
Remove<ClassSet>(ClassSet.ClassID.
BiggerThan(
9));
}
7.Moon.Orm更新数据
using (
var db=Db.
CreateDefaultDb()) {
Class c=
new
Class();
c.ClassName=
"综合测试ClassName2";
c.WhereExpression=ClassSet.ClassID.
BiggerThan(
9);
db.
Update(c);
}
8.Moon.Orm查询数据
8.1无实体类时,使用代码生成器生成实体类
List<T> ExecuteSqlToOwnList<T>(
string sql)
where T:
new()
List<T> ExecuteSqlToOwnList<T>(
string sql,
params
object[] values)
where T:
new()
List<T> GetOwnList<T>(MQLBase mql)
where T:
new()
8.2无需实体类
//-----------------------------1.用MQL--------------------------------------
List<Dictionary<
string,MObject>>
GetDictionaryList(MQLBase mql)
var m1=ClassSet.Select(ClassSet.ClassID,ClassSet.ClassName)
.
LeftJoin(
UserSet.
Select(UserSet.UserID))
.
ON(ClassSet.ClassID.
Equal(UserSet.UserID))
.
Where(UserSet.UserID.
BiggerThan(
9));
var list2=db.GetDictionaryList(m1);
//-----------------------------2.用sql语句------------------------------
List<Dictionary<
string,MObject>>
ExecuteSqlToDictionaryList(
string sql)
List<Dictionary<
string,MObject>>
ExecuteSqlToDictionaryList(
string sql,
params
object[] values)//支持参数化
DataSet
ExecuteSqlToDataSet(
string sql)
DataSet
ExecuteSqlToDataSet(
string sql,
params
object[] values)
int
ExecuteSqlWithNonQuery(
string sql)
8.3使用存储过程
DataSet
ExecuteProToDataSet(String procName,
params DbParameter[] parameters)
int
ExecuteProWithNonQuery(String procName,
params DbParameter[] parameters)
List<T> ExecuteProToOwnList<T>(String procName,
params DbParameter[] parameters)
where T:
new()
第三部分 MQL的邀请
MQL的现状:
1.目前完成了sqlserver sqlite oracle、mysql
的开发工作. 还需要postgreSQL、、db2的核心功能的开发,当然接口和核心模块都写好了,各类型数据库的模块我们需要实现基类即可.再次发出邀请,请您加入,发邮件给我 [email protected]
2.目前我们写代码生成器(已经支持sqlserver sqlite 、mysql),你可以加入写其他数据库的生成.
您的加入只需实现接口
您的参与,将奖励:
该版本的源代码
2013-11-3 20:01:12