与实体框架中的运营商一样?

bri*_*ien 83 .net sql-server linq-to-entities entity-framework

我们正在尝试在实体框架中为包含字符串字段的实体实现"LIKE"运算符,但似乎不支持它.有没有其他人试图做这样的事情?

这篇博客文章总结了我们遇到的问题.我们可以使用contains,但这只匹配LIKE的最简单的情况.组合contains,startswith,endswith和indexof将我们带到那里,但需要在标准通配符和Linq to Entities代码之间进行转换.

Jon*_*eet 148

我真的对EF一无所知,但在LINQ to SQL中,你通常使用String.Contains表达一个LIKE子句:

where entity.Name.Contains("xyz")
Run Code Online (Sandbox Code Playgroud)

翻译成

WHERE Name LIKE '%xyz%'
Run Code Online (Sandbox Code Playgroud)

(使用StartsWithEndsWith其他行为.)

我不完全确定这是否有用,因为当你说你试图实现 LIKE 时,我不明白你的意思.如果我完全误解了,请告诉我,我会删除这个答案:)

  • @Jon Skeet:据我所知,LIKE功能是ANSI标准的,它在SQL Server,Oracle和DB2中几乎相同. (4认同)
  • 请注意"WHERE Name LIKE'%xyz%'"将无法使用索引,因此如果表格很大,它可能无法很好地执行... (3认同)
  • 好吧,我们希望能够匹配 *blah *blah* foo*bar foo?bar ?foo*bar? 以及其他复杂的图案。我们当前的方法与您提到的类似,我们将使用 contains、indexof、startswith、endswith 等将这些查询转换为操作。我只是希望有一个更通用的解决方案。 (2认同)
  • 不是我知道的 - 我怀疑复杂的模式最终会更多地特定于数据库,并且难以以一般方式表达. (2认同)
  • 我在使用这些运算符和MS SQL时看到的一件事是EF将它们添加为转义参数"Name LIKE @ p _ _ _ _ _ _ _ _ _ _ _ _ _''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''只是在查询"Name like'%xyz%'中.对于我所拥有的场景,我仍然使用StartsWith和Contains,但是我是通过动态linq进行的,因为它将参数注入到我的场景中生成的SQL语句中更有效的查询.不确定这是否是一个EF 4.0的东西.你也可以使用ObjectQueryParameters来实现同样的事情...... (2认同)

sur*_*fen 33

我有同样的问题.

目前,我已经确定了基于http://www.codeproject.com/Articles/11556/Converting-Wildcards-to-Regexes?msg=1423024#xx1423024xx的客户端通配符/正则表达式过滤- 它很简单并且可以用作预期.

我发现了关于这个主题的另一个讨论:http://forums.asp.net/t/1654093.aspx/2/10
如果您使用实体框架> = 4.0,这篇文章看起来很有希望:

使用SqlFunctions.PatIndex:

http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions.patindex.aspx

像这样:

var q = EFContext.Products.Where(x =>
SqlFunctions.PatIndex("%CD%BLUE%", x.ProductName) > 0);
Run Code Online (Sandbox Code Playgroud)

注意:此解决方案仅适用于SQL-Server,因为它使用非标准PATINDEX函数.


Yan*_*ran 31

这是一个旧帖子,但对于任何寻找答案的人来说,这个链接应该有所帮助.

精简版:

SqlFunctions.PatIndex方法 - 在所有有效的文本和字符数据类型上返回指定表达式中第一次出现模式的起始位置,如果未找到模式则返回零

命名空间:System.Data.Objects.SqlClient程序集:System.Data.Entity(在System.Data.Entity.dll中)

论坛帖子中也会出现一些解释.

  • 接受回复到这个问题的MSDN论坛的答案如何接受[以下答案](http://stackoverflow.com/a/9122312/237917)? (57认同)

Dmi*_*lov 18

LIKE添加运算符Entity Framework Core 2.0:

var query = from e in _context.Employees
                    where EF.Functions.Like(e.Title, "%developer%")
                    select e;
Run Code Online (Sandbox Code Playgroud)

... where e.Title.Contains("developer") ...它相比,它实际上是转化为SQL LIKE而不是CHARINDEX我们看到的Contains方法.


Lod*_*nck 16

更新:在EF 6.2中有一个类似的运算符

Where(i => DbFunctions.Like(searchstring ,like expression)
Run Code Online (Sandbox Code Playgroud)

  • DbFunctions 是 System.Data.Entity 命名空间的静态类 (3认同)

小智 6

对于 EfCore,这里是构建 LIKE 表达式的示例

protected override Expression<Func<YourEntiry, bool>> BuildLikeExpression(string searchText)
    {
        var likeSearch = $"%{searchText}%";

        return t => EF.Functions.Like(t.Code, likeSearch)
                    || EF.Functions.Like(t.FirstName, likeSearch)
                    || EF.Functions.Like(t.LastName, likeSearch);
    }

//Calling method

var query = dbContext.Set<YourEntity>().Where(BuildLikeExpression("Text"));
Run Code Online (Sandbox Code Playgroud)


Rob*_*vey 5

它在文档中作为Entity SQL的一部分特别提到.您收到错误消息了吗?

// LIKE and ESCAPE
// If an AdventureWorksEntities.Product contained a Name 
// with the value 'Down_Tube', the following query would find that 
// value.
Select value P.Name FROM AdventureWorksEntities.Product 
    as P where P.Name LIKE 'DownA_%' ESCAPE 'A'

// LIKE
Select value P.Name FROM AdventureWorksEntities.Product 
    as P where P.Name like 'BB%'
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/bb399359.aspx