DotNetNext / SqlSugar

.Net aot ORM Fastest ORM Simple Easy VB.NET Sqlite orm Oracle ORM Mysql Orm 虚谷数据库 postgresql ORm SqlServer oRm 达梦 ORM 人大金仓 ORM 神通ORM C# ORM , C# ORM .NET ORM NET5 ORM .NET6 ORM ClickHouse orm QuestDb ,TDengine ORM,OceanBase orm,GaussDB orm ,Tidb orm Object/Relational Mapping
https://www.donet5.com/Home/Doc
MIT License
5.19k stars 1.32k forks source link

能否支持原生LIKE語法? #1168

Closed Yumitoya8569 closed 1 year ago

Yumitoya8569 commented 1 year ago

情境

1.比較儲存在表內的通配符

select * from permission where 'sys.user.insert' like id

--當 id = 'sys.user.%' 匹配
--當 id = 'sys.user.update' 不匹配

2.使用'%'以外的其他通配符

select * from permission where id like 'test_'

--當 id = 'test1' 匹配
--當 id = 'test123' 不匹配

建議

新增擴展

SqlFunc.Like(String, String)

或參考EF Core, 多了一個可選參數來設定逃逸字符 https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.dbfunctionsextensions.like?view=efcore-7.0

SqlFunc.Like(String, String, String)
DotNetNext commented 1 year ago

it.Name.Contains("a") like '%a%' it.Name.StartWith("a") like '%a' it.Name.EndWith("a") like 'a%' 都支持的

Yumitoya8569 commented 1 year ago

Contains, StartWith, EndWith 在應用上會自動補上通配符 '%'

在我前面提供的情境下皆不適用, 有時候需要利用不補'%'的like語法:

  1. 通配符來自資料表本身的內容而不是語法帶入
  2. 通配符不是'%', 有可能是各別資料庫的設計, 如SqlServer的: _ [ ] [^]
DotNetNext commented 1 year ago

大概理解你的意思你就是想一个不加任何符号的like

DotNetNext commented 1 year ago

你可以先这样用 Where(" name like @p",new {p="test_"}) 下个版本我加一个SqlFunc.ConatinsNoWith

Yumitoya8569 commented 1 year ago

可以參考EF Core的設計:

var customers1 = context.Customers.Where(c => c.Name.StartsWith("a"));
var customers2 = context.Customers.Where(c => EF.Functions.Like(c.Name, "a%"));

應該挺直觀的

Where(c => c.Name.StartsWith("a"))
Where(c => SqlFunc.Like(c.Name, "a%"))
DotNetNext commented 1 year ago

也行

DotNetNext commented 1 year ago

SqlSugarCore 5.1.4.87-preview08 已支持

DotNetNext commented 1 year ago

更新到预览版本或者下载最新源码