HTML5技术

Entity Framework Core Like 查询揭秘 - Sweet-Tang

字号+ 作者:H5之家 来源:H5之家 2017-09-13 12:05 我要评论( )

在Entity Framework Core 2.0中增加一个很酷的功能:EF.Functions.Like(),最终解析为SQL中的Like语句,以便于在 LINQ 查询中直接调用。 不过Entity Framework 中默认提供了StartsWith、Contains和EndsWith方法用于解决模糊查询,那么为什么还要提供EF.Funct

在Entity Framework Core 2.0中增加一个很酷的功能:EF.Functions.Like(),最终解析为SQL中的Like语句,以便于在 LINQ 查询中直接调用。

不过Entity Framework 中默认提供了StartsWith、Contains和EndsWith方法用于解决模糊查询,那么为什么还要提供EF.Functions.Like,今天我们来重点说说它们之间的区别。

表结构定义

在具体内容开始之前,我们先简单说明一下要使用的表结构。

public class Category { public int CategoryID { get; set; } public string CategoryName { get; set; } public override string ToString() { return $"{nameof(CategoryID)}: {CategoryID}, {nameof(CategoryName)}: {CategoryName}"; } }

在 Category 类型定义了两个字段:CategoryID、CategoryName。

public class SampleDbContext : DbContext { public virtual DbSet<Category> Categories { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("数据库连接字符串"); base.OnConfiguring(optionsBuilder); } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); EntityTypeBuilder<Category> entityTypeBuilder = modelBuilder.Entity<Category>(); entityTypeBuilder.ToTable("Category"); entityTypeBuilder.HasKey(e => e.CategoryID); entityTypeBuilder.Property(e => e.CategoryID).UseSqlServerIdentityColumn(); } }

我们使用 SampleDbContext 来访问数据库。

CategoryID CategoryName

1 Clothing

2 Footwear

3 Accessories

在数据库的 Category 表中插入上面三行记录。

EF.Functions.Like 使用示例

我们来看一个EF.Functions.Like()查询示例,查询 CategoryName 字段中包括字符串 “t” 的数据,传递的参数是 “%t%”:

[Fact] public void Like() { using (var dataContext = new SampleDbContext()) { var result= dataContext.Categories.Where(item => EF.Functions.Like(item.CategoryName, "%t%")).ToList(); foreach (var item in result) { _testOutputHelper.WriteLine(item.CategoryName); } } }

提示:在做一些示例演示时,个人喜欢会用 Xunit + Resharper,这样可以直接运行对应的示例,并且也可以直接输出对应的结果。

我们来看一下运行的结果:

EF.Functions.Like

查询的结果包含两条数据,这与我们预期结果一致。

字符串匹配模式

在这里,我暂且将StartsWith、Contains和EndsWith方法称之为字符串匹配模式。

您肯定在Entity Framework中使用过这些方式,我们还是简单说明一下这三个方法的作用:

我们可以通过Contains方法实现与前一个示例一致的功能:

[Fact] public void Contains() { using (var dataContext = new SampleDbContext()) { var result = dataContext.Categories.Where(item => item.CategoryName.Contains("t")).ToList(); foreach (var item in result) { _testOutputHelper.WriteLine(item.CategoryName); } } }

我们在Contains方法转入参数“t” ,运行的结果如下:

EF Contains

运行结果与 Like 函数示例的结果是一致的。

在这里我只列举了Contains的示例,StartsWith和EndsWith的功能非常相似,我就不重复列举了。

这两个示例的运行结果是一致的,那么微软为什么要提供EF.Functions.Like()方法呢?

通配符模糊查询

我们知道在 T-SQL 语句中 Like 关键字支持 通配符 ,下面简单介绍支持的通配符:

通配符 说明 示例

% 包含零个或多个字符的任意字符串。 WHERE title LIKE '%computer%' 将查找在书名中任意位置包含单词 "computer" 的所有书名。

_(下划线) 任何单个字符。 WHERE au_fname LIKE '_ean' 将查找以 ean 结尾的所有 4 个字母的名字(Dean、Sean 等)。

[ ] 指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符。 WHERE au_lname LIKE '[C-P]arsen' 将查找以 arsen 结尾并且以介于 C 与 P 之间的任何单个字符开始的作者姓氏,
例如 Carsen、Larsen、Karsen 等。

[^] 不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符。 WHERE au_lname LIKE 'de[^l]%' 将查找以 de 开始并且其后的字母不为 l 的所有作者的姓氏。

关于 Like 和通配符更多的知识请直接到MSDN中了解,链接地址:https://msdn.microsoft.com/zh-cn/library/ms179859(v=sql.110).aspx。

我们的将查询关键字由 “t” 改为 “[a-c]”,再来看上面两个示例分别运行的结果:

EF.Functions.Like 查询示例:

EF.Functions.Like

Contains 查询示例:

EF Contains

上面运行的结果,Like 查询的结果返回三条记录,而 Contains 查询的结果无任何数据返回。

我们借助 SQL Server Profiler 分别捕获这两个示例实际生成的SQL查询。

EF.Functions.Like 查询生成的SQL语句:

SELECT [item].[CategoryID], [item].[CategoryName] FROM [Category] AS [item] WHERE [item].[CategoryName] LIKE N'%[a-c]%'

Contains 查询生成的SQL语句:

SELECT [item].[CategoryID], [item].[CategoryName] FROM [Category] AS [item] WHERE CHARINDEX(N'[a-c]', [item].[CategoryName]) > 0

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • ASP.NET Core 运行原理解剖[5]:Authentication - 雨の夜

    ASP.NET Core 运行原理解剖[5]:Authentication - 雨の夜

    2017-09-11 11:16

  • .NET Core多平台开发体验[4]: Docker - Artech

    .NET Core多平台开发体验[4]: Docker - Artech

    2017-09-07 11:57

  • .NET Core 2.0应用程序大小减少50% - LineZero

    .NET Core 2.0应用程序大小减少50% - LineZero

    2017-09-06 08:05

  • ASP.NET Core MVC – Tag Helper 组件 - Sweet-Tang

    ASP.NET Core MVC – Tag Helper 组件 - Sweet-Tang

    2017-09-01 17:02

网友点评
t