码农家园

关闭
导航

关于.net:如何在Linq中使用SQL Like%?


.netlinqlinq-to-entitiessql-liketsql

How to do SQL Like % in Linq?

我在SQL中有一个过程,我正试图将其转换为LINQ:

1
2
3
4
SELECT O.Id, O.Name as Organization
FROM Organizations O
JOIN OrganizationsHierarchy OH ON O.Id=OH.OrganizationsId
where OH.Hierarchy like '%/12/%'

我最关心的是:

1
where OH.Hierarchy like '%/12/%'

我有一个列,它像/1/3/12/那样存储层次结构,所以我只使用%/12%/来搜索它。

我的问题是,LINQ或.NET等同于使用百分号是什么?

相关讨论

  • 你的问题至少得到了类似操作标签的5票。我可以请求您建议使用类似SQL的同义词吗?
  • 当然。完成。


1
.Where(oh => oh.Hierarchy.Contains("/12/"))

您也可以使用.StartsWith()或.EndsWith()。

相关讨论

  • 使用StartsWith()或EndsWith()是否将触发查询?我的意思是,代码会被转换成一个查询吗,或者在从数据库中检索之后,结果会被过滤到对象中?
  • 不可以。startswith()和endswith()是谓词/筛选器的一部分。执行继续推迟。
  • 尝试获取NullReferenceException:对象引用未设置为对象的实例。所以它不喜欢在我的例子中a.address1.startswith(address1)和a.address1为空
  • 对的。这与StartsWith无关。你的从属对象Address1在你的连接中不存在。
  • Yep通过使用几个用空检查包装的where子句来绕过它,因此:if(string.isNullOrEmpty(searchField))results=results.where(a=>a.searchField.startsWith(searchField)
  • @如果像'data'这样的词和我正在使用'da'搜索,那么它将检索不到正确的记录。您能提出任何建议吗?
  • 搜索"da"是否有效?如果是这样,安装SQL可能区分大小写。看看这个:stackoverflow.com/questions/1439485/…
  • StartsWith("abc")转换为LIKE 'abc%',EndsWith("abc")转换为LIKE '%abc'。
  • 不明白为什么这不适用于带字母的用例,然后意识到我的愚蠢…如果你想忽略这个案子,不要忘记.ToLower().Contains()等。当然,您是否希望这样做取决于您是否尝试从具有不区分大小写排序规则的数据库中模拟like。
  • 我更喜欢L P的回答。在某些情况下,如果没有这个解决方案,就无法做到。
  • @Simon_Weaver-只有在使用Linq to SQL语法时才是这样,否则会得到如下结果:((cast(charindex([extent1]。[hierarchyid],@p_uuq_uuu 0)as int))=1)
  • 那么,怎么做呢?一个世界的"wo%ld"
  • @savasadar看看这里:stackoverflow.com/questions/1040380/wildcard search for linq‌&8203;/…
  • 我仍然对.startswith()有问题。我在这里发布的:github.com/praeclarum/sqlite-net/issues/696
  • 关于"%abc%xyz%"?我怎么用LINQ表达这个?


使用此:

1
2
3
from c in dc.Organization
where SqlMethods.Like(c.Hierarchy,"%/12/%")
select *;
相关讨论

  • 如果您想使用like命令提供的更复杂的模式匹配,这真的很有用。例如,如果您想检查任何两个数字(而不是12),您可以使用以下表达式:sqlmethods.like(c.hierarchy,"%/[0-9][0-9]/%),另请参见msdn.microsoft.com/en-us/library/aa933232(sql.80).aspx
  • 如果您想让高级用户自己预先挂起昂贵的初始百分比,这也非常有用,因为使用startswith或contains并不能给高级用户这种灵活性。
  • 你如何使用"点符号"的SqlMethods?
  • 注意,您需要包括System.Data.Linq.SqlClient名称空间。
  • 虽然可以添加system.data.linq,但找不到system.data.linq.sqlclient。是否已弃用?
  • @ BurakKaraku?它对我有用。你有没有遗漏一个关于System.Data.Linq的参考资料?
  • @用户2428118不是,因为System.Data.Linq已经被引用并在代码的其他部分中使用。


我假设您正在使用linq to sql*(请参见下面的注释)。如果是,请使用string.contains、string.startswith和string.endswith生成使用类似SQL的运算符的SQL。

1
2
3
4
from o in dc.Organization
join oh in dc.OrganizationsHierarchy on o.Id equals oh.OrganizationsId
where oh.Hierarchy.Contains(@"/12/")
select new { o.Id, o.Name }

或

1
2
3
from o in dc.Organization
where o.OrganizationsHierarchy.Hierarchy.Contains(@"/12/")
select new { o.Id, o.Name }

注意:*=如果在.NET 3.5中使用ADO.NET实体框架(EF/L2E),请注意,它不会执行与LINQ到SQL相同的转换。尽管L2S进行了适当的转换,但L2E v1(3.5)将转换为T-SQL表达式,该表达式将强制对正在查询的表进行全表扫描,除非在WHERE子句或联接筛选器中有另一个更好的鉴别器。更新:这在ef/l2e v4(.net 4.0)中是固定的,因此它将像l2s一样生成SQL。

相关讨论

  • +1关于实体框架的意见
  • 不需要用@号来摆脱你的束缚,但我意识到这可能只是一个很好的惯例。


如果您使用的是vb.net,那么答案将是"*"。这是您的where子句的外观…

1
Where OH.Hierarchy Like '*/12/*'

注意:"*"匹配零个或多个字符。这里是类似操作符的MSDN文章。

相关讨论

  • 类似于vb的运算符是否转换为l2s调用?(我不知道。)
  • 是的,当在LINQ查询表达式中使用时,类似于VB的运算符将被转换为LIKE的SQL版本。此外,类似于VB的运算符不限于查询表达式。
  • 我看到它存在于Linq业务之外。好东西。+ 1


好指数对我也适用

1
2
3
var result = from c in SampleList
where c.LongName.IndexOf(SearchQuery) >= 0
select c;
相关讨论

  • 这应该是公认的答案。indexof在SQL中转换为charindex。这可能比想象的要快。但除此之外,它还提供了构造类似"%some%thing%"的搜索查询的可能性。其中"some"必须位于"thing"之前,而"thing"不能用contains完成。


使用这样的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
try
{
    using (DatosDataContext dtc = new DatosDataContext())
    {
        var query = from pe in dtc.Personal_Hgo
                    where SqlMethods.Like(pe.nombre,"%" + txtNombre.Text +"%")
                    select new
                    {
                        pe.numero
                        ,
                        pe.nombre
                    };
        dgvDatos.DataSource = query.ToList();
    }
}
catch (Exception ex)
{
    string mensaje = ex.Message;
}


.NET核心现在有EDOCX1[3]

相关讨论

  • 你能解释一下如何用这个来解决手术的问题吗?
  • 参见ie LP的答案,它只是sqlmethods的核心版本。
  • 这个答案应该包含一个如何使用这个函数的可操作的例子。


如果您不匹配数字字符串,最好使用常见的情况:

1
.Where(oh => oh.Hierarchy.ToUpper().Contains(mySearchString.ToUpper()))

1
System.Data.Linq.SqlClient.SqlMethods.Like("mystring","%string")

我总是这样做:

1
2
3
from h in OH
where h.Hierarchy.Contains("/12/")
select h

我知道我不使用LIKE语句,但它在后台的工作很好,是否将其转换为带有LIKE语句的查询。

相关讨论

  • 你的答案与公认的答案(7年前回答的)或其他答案有什么不同?它增加了什么价值?
  • @dawidferenczy这个答案适用于"from foo in bar"查询语法,而接受的查询语法则不适用。


试试这个,这个对我很好

1
from record in context.Organization where record.Hierarchy.Contains(12) select record;


对于那些像我这样在Linq中寻找"类SQL"方法的人来说,我有一些非常好的方法。

在这种情况下,我不能以任何方式更改数据库来更改列排序规则。所以我必须在我的LINQ中找到一种方法来做这件事。

我使用的helper方法SqlFunctions.PatIndexwitch的行为类似于真正的类SQL的操作符。

首先,我需要枚举搜索值中所有可能的发音符号(我刚刚学过的一个词),以获得如下内容:

1
2
3
déjà     => d[éèê?eéèê?E]j[aàa?Aà??]
montreal => montr[éèê?eéèê?E][aàa?Aà??]l
montréal => montr[éèê?eéèê?E][aàa?Aà??]l

然后以Linq为例:

1
2
3
4
var city ="montr[éèê?eéèê?E][aàa?Aà??]l";
var data = (from loc in _context.Locations
                     where SqlFunctions.PatIndex(city, loc.City) > 0
                     select loc.City).ToList();

因此,为了我的需要,我编写了一个助手/扩展方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
   public static class SqlServerHelper
    {

        private static readonly List<KeyValuePair<string, string>> Diacritics = new List<KeyValuePair<string, string>>()
        {
            new KeyValuePair<string, string>("A","aàa?Aà??"),
            new KeyValuePair<string, string>("E","éèê?eéèê?E"),
            new KeyValuePair<string, string>("U","u?üùU?üù"),
            new KeyValuePair<string, string>("C","c?C?"),
            new KeyValuePair<string, string>("I","i??I??"),
            new KeyValuePair<string, string>("O","????"),
            new KeyValuePair<string, string>("Y","Y?Yyy?")
        };

        public static string EnumarateDiacritics(this string stringToDiatritics)
        {
            if (string.IsNullOrEmpty(stringToDiatritics.Trim()))
                return stringToDiatritics;

            var diacriticChecked = string.Empty;

            foreach (var c in stringToDiatritics.ToCharArray())
            {
                var diac = Diacritics.FirstOrDefault(o => o.Value.ToCharArray().Contains(c));
                if (string.IsNullOrEmpty(diac.Key))
                    continue;

                //Prevent from doing same letter/Diacritic more than one time
                if (diacriticChecked.Contains(diac.Key))
                    continue;

                diacriticChecked += diac.Key;

                stringToDiatritics = stringToDiatritics.Replace(c.ToString(),"[" + diac.Value +"]");
            }

            stringToDiatritics ="%" + stringToDiatritics +"%";
            return stringToDiatritics;
        }
    }

如果你们中有人建议加强这种方法,我会很高兴听到你们的。

相关讨论

  • 您的示例基本上是自制的不区分重音的排序规则。我曾经不得不处理一个项目,在这个项目中,每个查询都要经过一个过滤器,才能自动完成正确的排序。请访问stackoverflow.com/a/2461550/1736944了解通常更好的方法。根据需要为数据库、表和/或字段分配适当的排序规则。(在没有适当整理的情况下工作是纯粹的折磨)


在LINQ中使用contains,就像在SQL中使用contains一样。

1
string _search="/12/";

. …

1
.Where(s => s.Hierarchy.Contains(_search))

您可以在LINQ中编写SQL脚本,如下所示:

1
 var result= Organizations.Join(OrganizationsHierarchy.Where(s=>s.Hierarchy.Contains("/12/")),s=>s.Id,s=>s.OrganizationsId,(org,orgH)=>new {org,orgH});


  • .net:如何在c#中枚举enum?
  • 如何仅返回SQL Server日期时间数据类型中的日期
  • 如何检查SQL Server表中是否存在列?
  • LINQ中的多个“order by”
  • SQL Server:如何加入第一行
  • 如何从SQL Server中的select执行update?
  • 关于sql:如何用“喜欢”查询MongoDB?
  • c#:为什么不继承List?

Copyright ©  码农家园 联系:[email protected]