Linq和SQL中的in和Like
今天在某个功能需要用到Linq中类似SQL中的in查询,但是这东西好像没用过鸭~~~~~
话不多说,先百度一下下!!!为了能够更好的理解记忆,我们把SQL和LINQ进行一个对比
使用 in
SQL:
select * from CodeFirstDb.dbo.Orders where id in ('1','2');
结果为:
LINQ:
using (var db = new OrderContext("CodeFirstDb")) { //方法语法 int[] ints = new int[] { 1, 2 }; var result = db.Orders.Where(p => ints.Contains(p.Id)); foreach (var item in result) { Console.WriteLine(item.Customer); } //标准查询语法 ints = new int[] { 4 }; result = from s in db.Orders where ints.Contains(s.Id) select s; foreach (var item in result) { Console.WriteLine(item.Customer); } }
结果为:
使用not in
SQL:
select * from CodeFirstDb.dbo.Orders where id not in ('1','2');
结果为:
Linq:
using (var db = new OrderContext("CodeFirstDb")) { //方法语法 int[] ints = new int[] { 1, 2 }; var result = db.Orders.Where(p => !(ints.Contains(p.Id))); foreach (var item in result) { Console.WriteLine(item.Customer); } //标准查询语法 ints = new int[] { 1, 2 }; result = from s in db.Orders where !(ints.Contains(s.Id)) select s; foreach (var item in result) { Console.WriteLine(item.Customer); } }
结果为:
使用Like
Sql中:
SELECT Id, Customer, OrderDate FROM Orders WHERE (Customer LIKE '%EFdemo%')
Linq中:
IQueryable<Order> queryable = from p in ctx.Orders where p.Customer.Contains("efdemo") select p; foreach (var item in queryable) { Console.WriteLine(item.Customer +"*******"+item.OrderDate); }
如果是 ‘EFdemo%’这种形式 则使用 where p.Customer.StartsWith("efdemo")
如果是 ‘%EFdemo’这种形式 则使用 where p.Customer.EndsWith("efdemo")
精确到字符串对应位数字符的模糊查询
SQL: SqlFunctions.PatIndex("_a__3%", des.PlateNum) > 0————————>sql server 的 like '_a__3%'
from des in db.ModelsVehicleRecognition where (SqlFunctions.PatIndex("_a__3%", des.PlateNum) > 0) select new { plateMun = des.PlateNum }
等同于
SELECT PlateNum FROM VehicleRecognition WHERE PlateNum like '_a__3%'
说明:'_a__3%' 中的下划线“_”表示一个字符,'_a__3%' 这个字符串查询意思就是第二个字符是a,第五个字符是3的字符串
因为a和3之间有两个下划线“_”所以查询出的结果也要满足a和3之间有两个字符才行,
也就是说两个精确字符之间隔了几个字符,在查询的时候就要写几个下划线“_”。
总结: 在Linq中使用IN的话,实现方式为contains() ,用in条件所组成的数组去判定每一条数据,如果是not in 的话 在判断条件上加上非!,
在Linq中使用like ,实现方式为 startswith(),endswith(),contains()