zoukankan      html  css  js  c++  java
  • Linq Like [转 韩天伟]

    Like的操作,有点像in,但是,方向变了。什么意思呢。就是你给定一个字符串,去寻找数据中某个字段包含这个字符串。就是给定的字符串是某字段的子集。Sql Script是这么写的。


    Selec * 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为


    SELECT [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为


    SELECT [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为


    SELECT [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为


    SELECT [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 character Description Example
    % 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为


    SELECT [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,其将会被翻译成类似下面的语句。


    SELECT columns FROM table WHERE
    column LIKE '%\%%' ESCAPE '\'
    escape 是因为某字段中含有特殊字符,比如%,_ [ ]这些被用作通配符的。这时就要用到Escape了。这是sql server的事情了。

  • 相关阅读:
    Spring Boot 2.3.0 正式发布!
    当互联网码农遇见国企老同学
    GitHub发布重大更新,关系到所有程序员!
    开发者被要求向破解者道歉,竟揪出“阿里云假员工”,网友:这人有前科
    等了整整12年!Linux QQ 终于更新了!
    我的电脑不联网,很安全,黑客:你还有风扇呢
    grpc的简单用例 (golang实现)
    grpc的简单用例 (C++实现)
    redis键过期 (redis 2.6及以上)
    安装folly库以及folly的ConcurrentHashMap的简单使用
  • 原文地址:https://www.cnblogs.com/wukong0214/p/2966166.html
Copyright © 2011-2022 走看看