ServiceStack OrmLite 数据库查询 几个实用方法 (继承表格式化集合等)
执行SQL语句:
int result = db.SqlScalar<int>("SELECT OBJECT_ID(@name)", new { name = "SomeName" });
继承表的实现 (存储于同一个表中)
[Alias("Table")] public abstract class MyBaseClass {public String Name { get; set; }public String Name1 { get; set; }public String Name2 { get; set; } }[Alias("Table")] public class MyDerivedClassA : MyBaseClass {}[Alias("Table")] public class MyDerivedClassB : MyBaseClass {}
格式化查询:
db.SelectFmt<Person>("Age > {0}", 40);Assert.That(db.GetLastSql(), Is.EqualTo("SELECT \"Id\", \"FirstName\", \"LastName\", \"Age\" FROM \"Person\" WHERE Age > 40"));db.SelectFmt<Person>("SELECT * FROM Person WHERE Age > {0}", 40);Assert.That(db.GetLastSql(), Is.EqualTo("SELECT * FROM Person WHERE Age > 40"));
这两种方法是等效的,还可以通过拼接字符串的方法,构造出复杂的查询条件,第一个参数中可以加多个项{0} {1} {2}
返回指定字段的列表:
db.Lookup<int, string>(db.From<Person>().Select(x => new { x.Age, x.LastName }).Where(q => q.Age < 50));Assert.That(db.GetLastSql(), Is.EqualTo("SELECT \"Age\",\"LastName\" \nFROM \"Person\"\nWHERE (\"Age\" < 50)"));db.Lookup<int, string>("SELECT Age, LastName FROM Person WHERE Age < @age", new { age = 50 });Assert.That(db.GetLastSql(), Is.EqualTo("SELECT Age, LastName FROM Person WHERE Age < @age"));db.LookupFmt<int, string>("SELECT Age, LastName FROM Person WHERE Age < {0}", 50);Assert.That(db.GetLastSql(), Is.EqualTo("SELECT Age, LastName FROM Person WHERE Age < 50"));
两种方式等效,可以使用类指定字段名,也可以字符串中指定
局部更新UpdateOnly
更新表中的部分字段是一个很常用的情形, SS提供有一个方法实现这个功能, 叫做 UpdateOnly.
UpdateOnly
表达式中第二个参数用于指定哪个字段被修改:
db.UpdateOnly(new Person { FirstName = "JJ" }, p => p.FirstName);
UPDATE "Person" SET "FirstName" = 'JJ'
db.UpdateOnly(new Person { FirstName = "JJ", Age = 12 }, onlyFields: p => new { p.FirstName, p.Age });
UPDATE "Person" SET "FirstName" = 'JJ', "Age" = 12
第三个表达式可以指定where子句:
db.UpdateOnly(new Person { FirstName = "JJ" }, onlyFields: p => p.FirstName, where: p => p.LastName == "Hendrix");
UPDATE "Person" SET "FirstName" = 'JJ' WHERE ("LastName" = 'Hendrix')
如果不使用表达式过滤器,也可以使用 ExpressionVisitor 构造器,当你想程序化构造更新表达式时,可以更加灵活:
db.UpdateOnly(new Person { FirstName = "JJ", LastName = "Hendo" }, onlyFields: q => q.Update(p => p.FirstName));
UPDATE "Person" SET "FirstName" = 'JJ'
db.UpdateOnly(new Person { FirstName = "JJ" }, onlyFields: q => q.Update(p => p.FirstName).Where(x => x.FirstName == "Jimi"));
UPDATE "Person" SET "FirstName" = 'JJ' WHERE ("LastName" = 'Hendrix')
如果你想使用无限自由的不确定类型模式,基于字符串的表达式,使用 .Params()
扩展方法对参数转义 (inspired by massive):
db.Update<Person>(set: "FirstName = {0}".Params("JJ"), where: "LastName = {0}".Params("Hendrix"));
甚至表名可以是一个字符串, 这样你就可以指定和上面功能相同的 update 操作彻底不需要使用Person模型:
db.Update(table: "Person", set: "FirstName = {0}".Params("JJ"), where: "LastName = {0}".Params("Hendrix"));
UPDATE "Person" SET FirstName = 'JJ' WHERE LastName = 'Hendrix'
查询并且生成集合:
1 直接返回字典类型结果
Dictionary<int, string> trackIdNamesMap = db.Dictionary<int, string>("select Id, Name from Track")
结构是字典类型,其中的Key来自于数据表的Id字段,value来自于数据表的Name字段,其中的Key也可以使用string类型的字段。value也可以使用其他类型字段。
2 直接返回字典类型结果 , 并且将结果分组
Lookup returns an Dictionary<K, List<V>> made from the first two columns: Dictionary<int, List<string>> albumTrackNames = db.Lookup<int, string>("select AlbumId, Name from Track")
结果是字典类型,其中的键是来自数据表的AlbumId字段,value是一个列表,这个类别是根据前边的AlbumId字段进行分组的,每个键值下有数目不等的Name的列表。
转载于:https://blog.51cto.com/soaop/1608479
相关文章:

Deepsort + Yolo 实现行人检测和轨迹追踪
作者 | 李秋键 出品 | AI科技大本营(ID:rgznai100) 引言 行人检测是近年来计算机视觉领域的研究热点,同时也是目标检测领域中的难点。其目的是识别和定位图像中存在的行人,在许多领域中都有广泛的应用。交通安全方面,无人驾驶汽车通过提前…

推荐15个国外使用 CSS3 制作的漂亮网站
今天分享的作品集网站有些特别,因为他们都是使用 CSS3 技术制作的。对于设计师来说,为了吸引注意力,作品集必须展示出你的能力,这有点像制作简历,要让人们看到你所擅长的,突出的部分,这是一次推…
7_2判断两个单链表是否相交,若相交,求出第一个交点
转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4251372.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,…

对抗软件系统复杂性①:如无必要,勿增实体
作者 | 袁进辉 我们经常面临如何评价一个大型软件系统质量的问题。首要的评价指标肯定是功能,软件是否满足主要的需求(do right things)。如果有多条技术路径可以实现同样的功能,人们倾向于选择更简单的办法。奥卡姆剃刀准则“如无必要,勿增实…

修改squid的Header中的X-Cache为Powered-By-LinuxTone
今天分析别人网站的时候,注意到国内的chinacache服务商的CDN加速,把squid默认的X-Cache修改为Powered-By-ChinaCache,如下图:以前注意了但是没去研究过,今天刚好有点空挡自己就来研究看看。我的squid版本:s…

NginxApachePHP参数汇总
1、Nginx vim /etc/nginx/conf.d/www.cmdschool.org.conf 12345678910111213client_max_body_size 30m; //上传文件大小改30M upstream www.cmdschool.org { server 10.168.82.25:87; ip_hash; } server { listen 80; server_name www.cmdschool.org; location / { proxy_pass …

android Intent PendingIntent的区别
含义:intent英文意思是意图,pending表示即将发生或来临的事情。 PendingIntent这个类用于处理即将发生的事情。比如在通知Notification中用于跳转页面,但不是马上跳转。 Intent 是及时启动,intent 随所在的activity 消失而消失。…

Squid如何提高命中率
缓存命中1.缓存时间设置,顾名思义,缓存时间设置的越长那么命中率也会相对较高。缓存与更新是一对矛盾的概念,既要做到高命中又要做到快速更新这个就需要自己对自己网站内容的了解然后指定合适的缓存策略。2.缓存能缓存的内容,什么…

海量秋招面试资料等你来拿!你离大厂也许并不远
秋招在即,你还在为秋招如何准备而发愁吗?你还在为拿不到大厂offer而苦恼吗?工欲善其事,必先利其器。金秋开学季,CSDN助力你的技术学习与成长,为你免费提供海量大厂面试资料,让你的秋招不再慌乱&…

Microsoft Dynamics CRM server 2013 中业务规则,有点像C#的正则表达式
Microsoft Dynamics CRM server 2013 中业务规则,我的理解就是有点像C#的正则表达式, 如方某个字段,必须输入什么范围的数值,其它字符不能乱输入。 打开方式有二种: 1. 种像上篇文章中写的那样, 在系统视图…

cCodeforces Round #286 (Div. 2)
A题。。暴力枚举在每个位置添加字符,然后检查一下是不是回文串 1 #include <iostream>2 #include <cstdio>3 #include <cstring>4 #include <algorithm>5 #include <cmath>6 #include <vector>7 8 using namespace std;9 10 #…

Sarg安装配置使用
SARG的全称是:Squid Analysis Report GeneratorSARG作为一款Squid日志分析工具,它采用html格式,详细列出了每一位用户访问internet的站点信息,时间占用信息,排名,连接次数,访问量,访…

OpenAI 以 10 亿美元出售「灵魂」,网友热评不再「Open」
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) OpenAI 如何以 10 亿美元的价格出售其灵魂:GPT-3 和 Codex 背后的公司并不像它声称的那样开放。 当金钱成为障碍时,最好的意图可能会被破坏。 近日,一篇“How Open…

IBM IMM默认ID 及修改默认IP 方法
默认ID: http://192.168.70.125 用户名:USERID 密码:PASSW0RD (数字0) BIOS 下更改IP方法:(另一种可进IMM 进行修改,此处不再介绍) 本文转自easy80851CTO博客,原文链接:http://blog.51cto.com/6…

squid 优化指南
很多squid 优化只限于在 squid参数和系统参数上面的调整。但是这个实在只是细枝末节的事情,只要不是太弱智的配置导致无法缓存,squid的性能不会有太大差距,也就提高10%左右,只有实际的业务针对squid 进行一些调整,squi…

Android TextView
2019独角兽企业重金招聘Python工程师标准>>> 1、TextView不用获取焦点也能实现跑马灯 public class MarqueeTextView extends TextView { Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if(focused) …

人脸识别模型的动手实践!
作者:宋志龙 来源:Datawhale人脸识别已经成为生活中越来越常见的技术,其中最关键的问题就是安全,而活体检测技术又是保证人脸识别安全性的一个重要手段,本文将向大家简单介绍活体检测,并动手完成一个活体检…

Pyqt5学习系列
最近在学习Pyqt5做界面,找到了一个非常棒的博主的学习系列 在此记录下来: http://blog.csdn.net/zhulove86/article/category/6381941

编程方式刷新Squid缓存服务器的五种方法
网站进行内容更新是常有的事情,当被缓存的资源更新时,前端Squid 缓存服务器内容也必须要相应的更新,否则用户就可能会看到过期的数据。当没有程序支持时就需要每次登录到服务器上执行刷新操作,在服务器数量小的的时候这种方式还可…

Android 实时文件夹
实时文件夹是一种用来显示由某个ContentProvider提供的数据信息的桌面组件。要创建一个实时文件夹,必须要有两个方面的支持。 1,要定义一个用来创建实时文件夹的Activity。 2,所指定数据信息URI的ContentProvider必须支持实时文件夹时文件夹查…

《新程序员002》图书正式上市! 从“新数据库时代”到“软件定义汽车”
20年前,伴随着互联网打开信息化大门,技术人成为新时代的开拓者。在时代的召唤下,CSDN于2001年推出国内首个面向IT人员的专业杂志——《程序员》,成为一代代开发者的技术启蒙。20年后的今天,人工智能、云计算、大数据等…

Xtrabackup bug记录
xtrabackup 2.1.2 2.1.3 均出现以下问题: 123xtrabackup: warning: Log block checksum mismatch (block no 191401143 at lsn 3946288081920):expected 800836998, calculated checksum 800832263xtrabackup: warning: this is possible when the log block has n…

RHEL5上配置VNCSERVER
VNC一个远程显示系统,管理员通过它不仅仅可以在运行程序的本地机上察看桌面环境,而且可以从 Internet上的任何地方察看远程机器的运行情况,而且它具有跨平台的特性。 Linux 要使用远程桌面需要安装VNC,Centos5,RHCE5 已经自带了VN…

勒索软件层出不穷,Veeam “3-2-1-1-0”助力构建数据防护
随着 AI、IoT、云原生等前沿技术的发展,近年来勒索病毒的攻击手段不断升级,赎金也越来越高:例如今年美国最大燃油管道受攻击导致美国17个州和华盛顿特区进入紧急状态,2020 年 Ripple20 0day 漏洞曝光,波及数亿台联网设…

大数据架构和模式(一)——大数据分类和架构简介
概述 大数据可通过许多方式来存储、获取、处理和分析。每个大数据来源都有不同的特征,包括数据的频率、量、速度、类型和真实性。处理并存储大数据时,会涉及到更多维度,比如治理、安全性和策略。选择一种架构并构建合适的大数据解决方案极具挑…

Windows 7 开发新特性
10月25日在西安举行的Windows 7 社区发布活动中我讲了Session1 -- Windows 7 概览。参会的人员达到62人,这个参加人数超过了我的预期,非常开心. 主要讲了一下内容: 一 构建于稳固的基础平台 1 . 改进的基础平台 兼容性: 兼容基于Windows Vista构建的应用程序与设备 …

GitHub 的 AI 编程工具漏洞高达 40% ,再次陷入争议……
整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 在近日发表的一篇论文中,研究人员对 GitHub Copilot 人工智能编程辅助工具进行了深入调查。结果发现,仍处于测试预览阶段的 Copilot 具有高达 40% 的错误代码率,意味…

centos中mysql重置密码
1 . 用空密码方式使用root用户登录 MySQL; mysql -u root 2. 修改root用户的密码; mysql> update mysql.user set passwordPASSWORD(’新密码’) where User’root’; mysql> flush privileges; mysql> quit 3. 重新启动MySQLÿ…

Centos 内存占满 释放内存
2019独角兽企业重金招聘Python工程师标准>>> 一台服务器,今天用 free -m 查看,发现内存跑满了。 再 top,然后按下shiftm,也就是按内存占用百分比排序,发现排在第一的进程,才占用0.9%,…

Android开发实践:为什么要继承onMeasure()
首先,我们写一个自定义View,直接调用系统默认的onMeasure函数,看看会是怎样的现象: 12345678910111213141516171819202122package com.titcktick.customview; import android.content.Context; import android.util.AttributeSet;…