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

Home Page:https://www.donet5.com/Home/Doc

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Where的Any Lambda條件支持

Yumitoya8569 opened this issue · comments

環境

.Net 7
Oracle 11g
SqlSugarCore 5.1.4.80

建議

以下3種寫法,目前僅2會通過, 也就是說清單必須是匿名類

var list = new List<string> { "a", "b", "c" };   
var query = _db.Queryable<MyTable1>()
	.Where(a => list.Any(s => s == a.col));
var list = new List<string> { "a", "b", "c" };
var tmpList = list.Select(x => new { col = x }).ToList();
var query = _db.Queryable<MyTable1>()
	.Where(a => tmpList.Any(s => s.col == a.col));
var list = new List<string> { "a", "b", "c" };
var tmpList = list.Select(x => new Test1 { col = x }).ToList();
var query = _db.Queryable<MyTable1>()
	.Where(a => tmpList.Any(s => s.col == a.col));

請問是否有機會至少支持1的寫法?
目的是想用Any配合Contains達成InLike的效果

var list = new List<string> { "a", "b", "c" };   
var query = _db.Queryable<MyTable1>()
	.Where(a => list .Contains(a.Id)).ToList();

普通in用法 id in (a,b,c)

var list = new List<string> { "a", "b", "c" };
           var tmpList = list.Select(x => new { col = x }).ToList();
           var query = db.Queryable<Order>()
               .Where(a => tmpList.Any(s => a.Name.Contains(s.col))).ToList();

in like 可以这样 (name like a ) or (name like b) or (name like c)

謝謝, 我了解這種寫法
不過實際上清單有很多而且應用在不同報表上
每個清單要轉換一層匿名類, 代碼邏輯上會有點詭異
所以想了解(1)的寫法有機會支援嗎?

好的我尽快支持,预计这周完成

SqlSugarCore 5.1.4.82-preview04 最新预览版本或者源码已支持可以试用

  var list1 = new List<string> { "a", "b", "c" };
            var query = db.Queryable<Order>()
                .Where(a => list1.Any(s => a.Name.Contains(s))).ToList();

謝謝, 我會找時間更新測試

可以了吗?

環境

SqlSugarCore 5.1.4.83

驗證

以下執行結果sql param只被帶入1組且值是1

var list = new List<string>() { "A", "C" };
var query = await _db.Queryable<MyTable1>()
    .Where(a => list.Any(s => a.code.Contains(s))).ToListAsync();

實際 OnLogExecuted Ouput

#SQL=
SELECT "CODE","NAME" FROM "MyTable1" "A"  WHERE  (  ("A"."CODE" like '%'||:MethodConst1||'%') OR ("A"."CODE" like '%'||:MethodConst1||'%')  )  
#PARAMS=
[:MethodConst1, 1] 

預期 OnLogExecuted Ouput

#SQL=
SELECT "CODE","NAME" FROM "MyTable1" "A"  WHERE  (  ("A"."CODE" like '%'||:MethodConst0||'%') OR ("A"."CODE" like '%'||:MethodConst1||'%')  )  
#PARAMS=
[:MethodConst0, A], [:MethodConst1, C]

SqlSugarCore 5.1.4.84-preview03

更新到最新预览版本已修复,Oracle和达梦 下的问题

84正式版預計什麼時候會發布?
發布後我會再找時間驗證

你可以用预览版本测试,正试测今天晚上发布

搜索时勾一下预览

已发布,还有问题发新的issue

環境

SqlSugarCore 5.1.4.84

驗證

var list = new List<string>() { "A", "C" };
var query = await _db.Queryable<MyTable1>()
    .Where(a => list.Any(s => a.code.Contains(s))).ToListAsync();

實際 OnLogExecuted Ouput

#SQL=
SELECT "CODE","NAME" FROM "MyTable1" "A"  WHERE  (  ("A"."CODE" like '%'|| 'A' ||'%') OR ("A"."CODE" like '%'|| 'C' ||'%')  )  
#PARAMS=
[:MethodConst1, 1] 

@DotNetNext
執行結果對了, 只是多了一個 [:MethodConst1, 1] 的參數, 不知道會不會影響複雜查詢的情況?
目前放棄參數化查詢是因為實作上的考量嗎?

后面版本会修化,暂时对使用无影响