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.24k stars 1.33k forks source link

Where的Any Lambda條件支持 #1154

Closed Yumitoya8569 closed 1 year ago

Yumitoya8569 commented 1 year ago

環境

.Net 7 Oracle 11g SqlSugarCore 5.1.4.80

建議

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

  1. var list = new List<string> { "a", "b", "c" };   
    var query = _db.Queryable<MyTable1>()
    .Where(a => list.Any(s => s == a.col));
  2. 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));
  3. 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的效果

DotNetNext commented 1 year ago
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)

DotNetNext commented 1 year ago
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)

Yumitoya8569 commented 1 year ago

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

DotNetNext commented 1 year ago

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

DotNetNext commented 1 year ago

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

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

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

DotNetNext commented 1 year ago

可以了吗?

Yumitoya8569 commented 1 year ago

環境

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]
DotNetNext commented 1 year ago

SqlSugarCore 5.1.4.84-preview03

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

Yumitoya8569 commented 1 year ago

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

DotNetNext commented 1 year ago

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

DotNetNext commented 1 year ago

搜索时勾一下预览

DotNetNext commented 1 year ago

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

Yumitoya8569 commented 1 year ago

環境

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] 的參數, 不知道會不會影響複雜查詢的情況? 目前放棄參數化查詢是因為實作上的考量嗎?

DotNetNext commented 1 year ago

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