SQL基础查询和LINQ集成化查询
select
select 语句用于从表中选取数据,是 sql 最基本的操作之一。
通过 select 查询的结果被存储在一个结果表中(称为结果集)。
sql select 语法
只查询某个列的数据:
select [列名称] from [表名称]
查询所有列的数据
select * from [表名称]
sql
查询所有数据
select * from categories
查询一列或多列
select category_id,category_name from categories
查询表达式
var list = from categories in context.categories select new { categories.categoryid, categories.categoryname }; var lists = from categories in context.categories select categories;
查询语句
var list = context.categories.select(categories => new { categories.categoryid, categories.categoryname }); var lists = context.categories.select(categories => categories);
sql select distinct 语句
distinct 可以去除查询结果集中完全相同的项,只有每一个列中每一个数据都相同,才能被认为是“完全相同”。
可在 categories 表中添加相同数据的项进行测试(除主键外相同)。
sql
select distinct category_id,category_name from categories
查询表达式
var dislist = list.distinct(); var dislist2 = (from categories in context.categories select new { categories.categoryid, categories.categoryname }).distinct();
查询语句
var dislist = list.distinct(); var dislist2 = context.categories.distinct().select(categories => new { categories.categoryid, categories.categoryname });
where 和 操作符
用于条件筛选。
操作符 | 描述 |
---|---|
= | 等于 |
<> | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
between | 在某个范围内 |
like | 搜索某种模式 |
注释:在某些版本的 sql 中,操作符 <> 可以写为 !=。
between 和操作符
between ... and
或 between ... or
c# 中可以使用 &&
或 ||
表示。
sql
select [列名称] from [表名称] where [列] [运算符] [值]
select category_id, category_name from categories where between category_id > 1 and category_id < 5
查询表达式
var list3 = from categories in context.categories where categories.categoryid > 1 && categories.categoryid < 5 select categories;
查询语句
var list3 = context.categories.where(x => x.categoryid > 1 && x.categoryid < 5);
like 和通配符
在 sql 中,可使用以下通配符:
通配符 | 描述 |
---|---|
% | 替代一个或多个字符 |
_ | 仅替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist]或者[!charlist] | 不在字符列中的任何单一字符 |
sql
select * from categories where category_name like 'b%'
查询表达式
var list4 = from categories in context.categories where categories.categoryname.startswith("b") select categories;
不能直接使用 %。
查询语句
var list4 = context.categories.where(x => x.categoryname.startswith("b"));
linq 只有 startwith 、 endwith 和 contains,没有其它通配符。
而 ef中提供了 ef.functions.like()
来进行通配符操作。
例如:
var list5 = from categories in context.categories where ef.functions.like(categories.categoryname,"b_") select categories;
var list5 = context.categories.where(x => ef.functions.like(x.categoryname, "b_"));
更多通配符操作,请自行了解 ef.functions.like()
。
order by 排序
sql
select * from categories order by category_id
c#
var list6 = (from categories in context.categories select categories).orderby(c => c.categoryid); var list7 = from categories in context.categories orderby categories.categoryid select categories;
var list6 = context.categories.orderby(x => x.categoryid).tolist(); var list7 = context.categories.tolist().orderby(x=>x.categoryid);
top
postgresql 中没有 top,可以使用 offset、limit 代替。
select select_list from table_expression [ order by ... ] [ limit { number | all } ] [ offset number ]
top(5) 的表达
select * from test order by test limit 5
或者
select * from test offset 0 limit 5
一般与 order by 一起使用
select * from test order by test offset 5 limit 5
limit all
的效果和省略limit
子句一样,例如下面的 sql 或获取全部数据。
select * from test limit all --等价 select * from test
c#代码中,则相应使用 take 、 skip。
var list = (from c in context.userroles select c).skip(0).take(5);
var list = context.userroles.skip(0).task(5);
例外:
t-sql 中的 top(1) ,在 postgresql 中,可以表示
select * from test limit 1
而 c# 表示:
var list00 = (from c in context.userroles select c).first(); var list01 = (from c in context.userroles select c).firstordefault(); var list02 = (from c in context.userroles select c).take(1); var list10 = context.userroles.first(); var list11 = context.userroles.firstordefault(); var list12 = context.userroles.take(1);
可以使用 first() 或 firstordefault() 返回查询结果中的第一条数据,方法体中不加条件,相当于 top(1)
。
takewhile 和 skipwhile
takewhile
运行查询,直到某一条件成立才停止获取;即当条件成立时,才会停止。
skipwhile
运行查询,直到某一条件成立才停止跳过;即当条件成立时,才会开始。
in
与 where 一起使用,表示符合条件中的一个。
select * from test where test in ('1','2')
select * from test where test not in ('1','2')
c# 中用 contains 表示
string[] item = new string[] { "a","b","c"}; var list = from c in context.userroles where item.contains(c.roleid) select c;
var list2 = context.userroles.where(x => item.contains(x.roleid));
alias(as)
sql 中,可以给查询的列设置别名,例如
select test as ttttt from test
c#中,应该无直接如此的操作。
不过,很多操作形式最后生成的 sql 都会出现 as。
exists 和 not exists
sql | c# |
---|---|
in | contains |
exists | any |
not exists | all |
exists
判断子查询中是否有结果集返回,如果有即为 true。
子查询中应当有 where 等条件
select * from test exists ({子查询})
exists 并不关注 子查询中返回了什么、返回了多少结果集,它只判断有没有结果返回(查询返回的结果集,行数>0)。
例如
select * from test exists (select 1 from test where test == "a")
c#
使用 .any()
var list = from s in context.userroles where (from c in context.userroles select c).any() select s;
var list2 = context.userroles.where(x => context.userroles.any());
any() 中也可以加条件
var list = from s in context.userroles where (from c in context.userroles select c).any(x => x.roleid != "x") select s;
var list2 = context.userroles.where(x => context.userroles.any(x => x.roleid != "x"));
not exists
无结果集返回则为,没有返回则为 true。
子查询中应当有 where 等条件判断。
linq 的 拓展方法 all,表示每一个元素是否都符合条件。返回 bool。。
var list = from s in context.userroles where context.userroles.all(x=>x.roleid=="a") select s;
var list2 = context.userroles.where(x => context.userroles.all(x => x.roleid == "x"));
in 比 exists 的速度快。
到此这篇关于sql基础查询和linq集成化查询的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。