标签:ret count 查询语句 cas 返回值 sel 语句 关联 分布式
正文
CRL采用Lambda表达式表示查询逻辑,表达式和拼串式的语法比较,优点如下
CRL对象管理基类是个抽象类,里面封装好了常用的方法,这意味着,不用再傻傻的去写什么FindOne,FindAll方法了
ORM只是CRL中的一部份功能,对象管理类是进一步封装,所以才有CRL.BaseProvider<T>
实现对象管理
public class ProductDataManage : CRL.BaseProvider<ProductData> public static ProductDataManage Instance { get { return new ProductDataManage(); } } var instance = ProductDataManage.Instance;
直接用表达式查询
var item = instance.QueryItem(b => b.Id > 1); var list = instance.QueryList(b => b.Id > 1);
创建完整查询语法
var query = instance.GetLambdaQuery();//创建查询 query.Top(100);//取多少条 query.Where(b => b.Id < 700);//查询条件 query.OrderBy(b => b.Id, true);//排序条件 var list = query.ToList();
如果要进行分页,则只需
query.Page(10, 1);//页大小,页索引
以上是返回当前对象,若要返回指定某些属性,可返回Dynamic类型
如GROUP查询
//using CRL以获取扩展方法 var query = instance.GetLambdaQuery(); query.Where(b => b.Id > 0); query.Top(10); //选择GROUP字段 query.Select(b => new { b.BarCode, sum2 = b.SUM(x => x.Number * x.Id),//等效为 sum(Number*Id) as sum2 total = b.BarCode.COUNT(),//等效为count(BarCode) as total sum1 = b.Number.SUM(),//等效为sum(Number) as sum1 b.ProductName }); //GROUP条件 query.GroupBy(b => new { b.BarCode, b.ProductName }); //having query.GroupHaving(b => b.Number.SUM() >= 0); //设置排序 query.OrderBy(b => b.BarCode.Count(), true);//等效为 order by count(BarCode) desc var list = query.ToDynamic();
一般只返回选择的部份字段,调用Select方法,返回动态类型
//返回筛选值 var query = instance.GetLambdaQuery(); query.Top(10); var member = new Code.Member(); member.Id = 11; query.Join<Code.Member>((a, b) => a.UserId == member.Id && b.Id > 0, CRL.LambdaQuery.JoinType.Left ).Select((a, b) => new { BarCode1 = a.BarCode, Name1 = b.Name,a.ProductName }); var list = query.ToDynamic();
如果要返回主表所有字段,和关联表部份字段呢,调用SelectAppendValue方法
此时返回主对象和内置索引值
//把关联值存入对象内部索引 //关联对象值都以索引方式存取 var query = instance.GetLambdaQuery(); query.Top(10); query.Join<Code.Member>((a, b) => a.UserId == b.Id && b.Id > 0, CRL.LambdaQuery.JoinType.Left ).SelectAppendValue(b => new { Name1 = b.Name }); var list = query.ToList(); foreach (var item in list) { var str = string.Format("{0}______{1}<br>", item.BarCode, item.Bag.Name1);//取名称为Name1的索引值 Response.Write(str); }
如果有多次关联,再调用Join方法即可
通过这两种返回值方式,相信可以适应大部份场景了
为了实现SQL函数调用,用扩展方法代替表示
以下是CRL支持的扩展方法
//using CRL 以获取扩展方法 //对于一元运算,可按!=判断,如b.ProductName.Contains("122") 和!b.ProductName.Contains("122") var query = instance.GetLambdaQuery(); query.Where(b => b.Id < b.Number);//直接比较可以解析通过 query.Where(b => b.ProductName.Contains("122"));//包含字符串 query.Where(b => !b.ProductName.Contains("122"));//不包含字符串 query.Where(b => b.ProductName.In("111", "222"));//string in query.Where(b => b.AddTime.Between(DateTime.Now, DateTime.Now));//在时间段内 query.Where(b => b.AddTime.DateDiff(DatePart.dd, DateTime.Now) > 1);//时间比较 query.Where(b => b.ProductName.Substring(0, 3) == "222");//截取字符串 query.Where(b => b.Id.In(1, 2, 3));//in query.Where(b => !b.Id.In(1, 2, 3));//not in query.Where(b => b.UserId.Equals(Code.ProductChannel.其它));//按值等于,enum等于int query.Where(b => b.ProductName.StartsWith("abc"));//开头值判断 query.Where(b => b.Id.Between(1, 10));//数字区间 query.Where(b => b.ProductName.Like("123"));// %like% query.Where(b => b.ProductName.LikeLeft("123"));// %like query.Where(b => b.ProductName.LikeRight("123"));// like% query.Where(b => !string.IsNullOrEmpty(b.BarCode)); int LastDays = 30; query.Where(b => b.AddTime.DateDiff(CRL.DatePart.dd, DateTime.Now) < LastDays);
一些转换函数也支持
query.Where(b => b.Id.ToString() == "123");//支持Cast转换 query.Where(b => Convert.ToString(b.Id) == "1");
等等...
关于结果返回
打印查询
当是完整查询,调用query.PrintQuery()返回生成的查询语句和参数
如上关联查询打印出来为
[SQL]:select top 10 t1.[BarCode] as BarCode1,t2.[Name] as Name1,t1.[ProductName1] as ProductName from [ProductData] t1 with(nolock) Left join [Member] t2 with(nolock) on ((t1.[UserId]=@par0) AND (t2.[Id]>@par1)) [par0]:[11] [par1]:[0]
标签:ret count 查询语句 cas 返回值 sel 语句 关联 分布式
原文地址:http://www.cnblogs.com/hubro/p/6038503.html