首页 > 编程语言 >C#3.0入门系列(十一)-之In, Like操作

C#3.0入门系列(十一)-之In, Like操作

时间:2023-08-18 15:13:52浏览次数:32  
标签:Customers Like C# db t0 3.0 where CustomerID

有这么一个例子,寻找一个表中的某个字段介于某个给定的集合该怎么办?Sql写起来很简单,比如:Select * from table where id in (2,3, 4, 5)。 就是寻找id字段为这个给定的集合(2,3, 4, 5)内的值。那Linq to Sql该怎么做呢?一个字,简单。

In Operator 
比如,我们想要查找,"AROUT", "BOLID" 和 "FISSA" 这三个客户的订单。该如何做呢?Linq to Sql是这么做的。
[] customerID_Set = new string[] { "AROUT", "BOLID", "FISSA" };

        var q = (from o in db.Orders
                 where customerID_Set.Contains(o.CustomerID)
                 select o).ToList(); 其生成的sql语句为
[t0].[OrderID], [t0].[CustomerID], [t0].[EmployeeID], [t0].[OrderDate], [
t0].[RequiredDate], [t0].[ShippedDate], [t0].[ShipVia], [t0].[Freight], [t0].[Sh
ipName], [t0].[ShipAddress], [t0].[ShipCity], [t0].[ShipRegion], [t0].[ShipPosta
lCode], [t0].[ShipCountry]
FROM [dbo].[Orders] AS [t0]
WHERE [t0].[CustomerID] IN (@p0, @p1, @p2)
-- @p0: Input String (Size = 5; Prec = 0; Scale = 0) [AROUT]
-- @p1: Input String (Size = 5; Prec = 0; Scale = 0) [BOLID]
-- @p2: Input String (Size = 5; Prec = 0; Scale = 0) [FISSA] 先定义了一个数组,在linq query中,使用Contains,也很好理解,就是这个数组,包含了所有的CustomerID, 即返回结果中,所有的CustomerID都在这个集合内。也就是in。 你也可以把数组的定义放在linq语句里。比如:
var q = (from o in db.Orders
                 where (new string[] { "AROUT", "BOLID", "FISSA" }).Contains(o.CustomerID)
                 select o).ToList(); Not in 呢?加个取反就是
var q2 = (from o in db.Orders
                 where !(new string[] { "AROUT", "BOLID", "FISSA" }).Contains(o.CustomerID)
                 select o).ToList(); 就这么简单。

Like Operator
Like的操作,有点像in,但是,方向变了。什么意思呢。就是你给定一个字符串,去寻找数据中某个字段包含这个字符串。就是给定的字符串是某字段的子集。Sql Script是这么写的。
* from table where id like '%AD%'
Selec * from table where id like '%AD'
Selec * from table where id like 'AD%' 上面的%是通配符,表示,该字段含有某个值,不知道的位置使用%代替。第一个是表示中间一段是AD,两头不清楚。第二个是结尾是AD,前面的不清楚。第三个相反,开头是AD,结尾不清楚。其对应的Linq 语句为
var q = (from c in db.Customers
                 where c.CustomerID.Contains("ROUT")
                 select c).ToList(); 其生成的sql为
[t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactT
itle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Coun
try], [t0].[Phone], [t0].[Fax]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[CustomerID] LIKE @p0
-- @p0: Input String (Size = 6; Prec = 0; Scale = 0) [%ROUT%] 以ISSA结尾,头部通配:
var q = (from c in db.Customers
                 where c.CustomerID.EndsWith("ISSA")
                 select c).ToList(); 其生成的sql为
[t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactT
itle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Coun
try], [t0].[Phone], [t0].[Fax]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[CustomerID] LIKE @p0
-- @p0: Input String (Size = 5; Prec = 0; Scale = 0) [%ISSA] 以ARO开始,尾部通配:
var q = (from c in db.Customers
                 where c.CustomerID.StartsWith("ARO")
                 select c).ToList(); 其生成的sql为
[t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactT
itle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Coun
try], [t0].[Phone], [t0].[Fax]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[CustomerID] LIKE @p0
-- @p0: Input String (Size = 4; Prec = 0; Scale = 0) [ARO%]
Linq 还提供了一种方法,叫做SqlMethods.Like,需要先添加System.Data.Linq.SqlClient名称空间。上面的三个可以写成
var q = (from c in db.Customers
                 where SqlMethods.Like(c.CustomerID, "%ROUT%")
                 select c).ToList(); 这里,你需要自己填写通配符,告诉Linq你是如何匹配。比如
var q = (from c in db.Customers
                 where SqlMethods.Like(c.CustomerID, "%ISSA")
                 select c).ToList(); 再比如:
var q = (from c in db.Customers
                 where SqlMethods.Like(c.CustomerID, "ARO%")
                 select c).ToList(); SqlMethods.Like最奇妙的地方,莫过于,自己定义的通配表达式,你可以在任何地方实现通配。比如
var q = (from c in db.Customers
                 where SqlMethods.Like(c.CustomerID, "A%O%T")
                 select c).ToList(); 其生成的sql为
[t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactT
itle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Coun
try], [t0].[Phone], [t0].[Fax]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[CustomerID] LIKE @p0
-- @p0: Input String (Size = 5; Prec = 0; Scale = 0) [A%O%T]
就是最标准的知道以A开头,以T结尾,中间知道一个值O,其他就什么不知道了。就用这个。
SQL Server 定义了四种通配符,在这里都可以使用。它们是:

Wildcard characterDescriptionExample
% Any string of zero or more characters. WHERE title LIKE '%computer%' finds all book titles with the word 'computer' anywhere in the book title.
_ (underscore) Any single character. WHERE au_fname LIKE '_ean' finds all four-letter first names that end with ean (Dean, Sean, and so on).
[ ] Any single character within the specified range ([a-f]) or set ([abcdef]). WHERE au_lname LIKE '[C-P]arsen' finds author last names ending with arsen and beginning with any single character between C and P, for example Carsen, Larsen, Karsen, and so on.
[^] Any single character not within the specified range ([^a-f]) or set ([^abcdef]). WHERE au_lname LIKE 'de[^l]%' all author last names beginning with de and where the following letter is not l.

%表示零长度或任意长度的字符串。_表示一个字符。[]表示在某范围区间的一个字符。[^]表示不在某范围区间的一个字符
比如:
var q = (from c in db.Customers
                 where SqlMethods.Like(c.CustomerID, "A_O_T")
                 select c).ToList(); 就用_代表一个字符。其生成sql为
[t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactT
itle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Coun
try], [t0].[Phone], [t0].[Fax]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[CustomerID] LIKE @p0
-- @p0: Input String (Size = 5; Prec = 0; Scale = 0) [A_O_T]
对于Not Like,也很简单,加个取非就是。
var q = (from c in db.Customers
                 where !SqlMethods.Like(c.CustomerID, "A_O_T")
                 select c).ToList();
SqlMethods.Like还有一个参数,叫escape Character,其将会被翻译成类似下面的语句。
FROM table WHERE 
    column LIKE '%\%%' ESCAPE '\' escape 是因为某字段中含有特殊字符,比如%,_ [ ]这些被用作通配符的。这时就要用到Escape了。这是sql server的事情了。详细情况请参考:
http://msdn2.microsoft.com/en-us/library/Aa933232(SQL.80).aspx

标签:Customers,Like,C#,db,t0,3.0,where,CustomerID
From: https://www.cnblogs.com/cuihongyu3503319/p/17640560.html

相关文章

  • C++快速入门 第二十八讲:多继承(multiple inheritance)
    1多继承语法:23//助教类既继承于老师类,又继承于学生类4classAssistant:publicTeacher,publicStudent5{6};78当遇到的问题无法只用一个“是一个”关系来描述的时候,就是多继承出场的时候。例即是学生,又是人,还是助教。910#include<iostre......
  • C++快速入门 第三十讲:错误处理和调试
    程序出错可以分为两大类:编译时出错(complie-timeerror)和运行时错误(run-timeerror)suggest1:培养并保持一种编程风格suggest2:认真对待编译器给出的错误/警告信息suggest3:写代码三思而后行(先画流程图)suggest4:注意检查最基本的语法suggest5:把可能有问题的代码行注释suggest......
  • C++快速入门 第二十九讲:虚继承
    通过虚继承某个基类,就是在告诉编译器:从当前这个类再派生出来的子类只能拥有那个基类的一个实例。虚继承的语法:1classTeacher:virtualpublicPerson23{45}这样做的话便可以让Student和Teacher类都虚继承自Person类,编译器将确保从Student和Teacher类再派生出来的子......
  • C++快速入门 第三十一讲:错误处理与调试2
    让函数返回错误代码实例:范围限制1#include<iostream>2#include<climits>34usingnamespacestd;5classFactorial6{7public:8Factorial(unsignedshortnum);9unsignedlonggetFactorial();10boolinRange();1112private......
  • C++快速入门 第三十二讲:assert函数和捕获异常
    C语言和C++都有一个专门为调试而准备的工具函数---assert函数。这个函数是在assert.h库文件里定义的。实例1:assert函数应用1#include<cassert>2//assert()函数需要有一个参数,它将测试这个输入参数的真或者假状态3//如果为真Donothing4//如果为假Dosomething......
  • CompositePattern-组合模式
    在C#中,组合模式(CompositePattern)是一种结构型设计模式,它允许您将对象组合成树状的结构,以表示部分-整体的层次关系,使得客户端可以以一致的方式处理单个对象和对象组合。在组合模式中,有以下几个角色:Component(组件):是组合中所有对象的通用接口,可以是抽象类或接口。它声明了一些操作......
  • IC设计产业震荡,高通裁员潮或掀起市场洗牌 | 百能云芯
    高通(Qualcomm)是知名的IC设计公司,在2023年第二季度财报会议上,因市场不景气,提出了强调成本控制的计划。同时,高通也向美国地方政府提交了裁员计划,这波裁员潮传至台湾。然而,高通的裁员可能对供应商和采购数量造成影响,因为台湾供应链与之密切相关,市场的挑战会连锁反应。特别是手机零部件......
  • CentOS7源码安装JDK8☘️
    1.下载jdk  Java版本支持路线图 Java9、Java10、Java12、Java13、Java14、Java15和Java16均为短期版本,建议不要使用以上版本。官网下载如有旧版本请先卸载openjdk:[root@localhost~]#yumerase`rpm-qa|grepopenjdk`-y2.解压安装:[root@localhost~]#tarxvz......
  • 【8月19日】红帽openstack管理课程(CL210) 新一轮开课
    课程介绍通过实验室操作练习,学员将能够深入学习红帽企业LinuxOpenStack®平台各服务的手动安装方法,还将了解OpenStack开发社区的未来发展计划。培训地点:线下面授:苏州市姑苏区干将东路666号和基广场401室;远程直播:腾讯会议平台开课时间:2023年8月19日开始—9月16日结束课程对象负......
  • 2023年9月北京/杭州/深圳DAMA-CDGA/CDGP认证报名
    据DAMA中国官方网站消息,2023年度第三期DAMA中国CDGA和CDGP认证考试定于2023年9月23日举行。 报名通道现已开启,相关事宜通知如下: 考试科目: 数据治理工程师(CertifiedDataGovernanceAssociate,CDGA)数据治理专家(CertifiedDataGovernanceProfessional,CDGP) 考试时间: CDGA:2023......