From c47adada99245ae7648d1aba195651c7adaa0629 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Mon, 5 May 2025 14:26:49 +0800 Subject: [PATCH] Update mongodb --- .../QueryAggregateHandler.cs | 6 +++-- .../MongoDb.Ado.data/MongoDbDataAdapter.cs | 10 +++++-- .../MongoDb.Ado.data/MongoDbDataReader.cs | 27 ++++++++++++++----- .../MongoDb/DbBind/MongoDbDbBind.cs | 25 ++++++++++++++++- .../MongoDb/DuckDBProvider.cs | 2 +- 5 files changed, 57 insertions(+), 13 deletions(-) diff --git a/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteDbDataReaderItems/QueryAggregateHandler.cs b/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteDbDataReaderItems/QueryAggregateHandler.cs index d074db91f..b4c7923e5 100644 --- a/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteDbDataReaderItems/QueryAggregateHandler.cs +++ b/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteDbDataReaderItems/QueryAggregateHandler.cs @@ -1,6 +1,7 @@ using MongoDB.Bson; using MongoDB.Bson.Serialization; using MongoDB.Driver; +using MongoDB.Driver.Linq; using System; using System.Collections.Generic; using System.Data.Common; @@ -20,8 +21,9 @@ namespace MongoDb.Ado.data var aggregateFluent = collection.Aggregate(pipeline.Select(stage => new BsonDocument(stage.AsBsonDocument)).ToArray()); // 执行聚合查询并返回 DbDataReader - var cursor = aggregateFluent.ToEnumerable(); - return new MongoDbBsonDocumentDataReader(cursor); + var cursor = aggregateFluent.ToList(); + var result= new MongoDbBsonDocumentDataReader(cursor); + return result; } } } diff --git a/Src/Asp.NetCore2/MongoDb.Ado.data/MongoDbDataAdapter.cs b/Src/Asp.NetCore2/MongoDb.Ado.data/MongoDbDataAdapter.cs index b29baed59..5e63d2284 100644 --- a/Src/Asp.NetCore2/MongoDb.Ado.data/MongoDbDataAdapter.cs +++ b/Src/Asp.NetCore2/MongoDb.Ado.data/MongoDbDataAdapter.cs @@ -1,4 +1,5 @@ -using System; +using MongoDB.Bson; +using System; using System.Collections.Generic; using System.Data; using System.Data.Common; @@ -105,7 +106,12 @@ namespace MongoDb.Ado.data DataRow daRow = dt.NewRow(); for (int i = 0; i < columns.Count; i++) { - daRow[columns[i].ColumnName] = dr.GetValue(i); + var value = dr.GetValue(i); + if(value is ObjectId) + { + value = value?.ToString(); + } + daRow[columns[i].ColumnName] = value; } dt.Rows.Add(daRow); } diff --git a/Src/Asp.NetCore2/MongoDb.Ado.data/MongoDbDataReader.cs b/Src/Asp.NetCore2/MongoDb.Ado.data/MongoDbDataReader.cs index 5233e44a3..fb8df9608 100644 --- a/Src/Asp.NetCore2/MongoDb.Ado.data/MongoDbDataReader.cs +++ b/Src/Asp.NetCore2/MongoDb.Ado.data/MongoDbDataReader.cs @@ -6,6 +6,7 @@ using MongoDB.Bson; using System.Data; using System.Collections; using System.Linq; +using MongoDB.Bson.Serialization; namespace MongoDb.Ado.data { @@ -13,9 +14,13 @@ namespace MongoDb.Ado.data { private readonly IEnumerator _enumerator; private BsonDocument _current; + private IEnumerable _documents; + private BsonDocument _firstObj; public MongoDbBsonDocumentDataReader(IEnumerable documents) { _enumerator = documents.GetEnumerator(); + _documents = documents; + _firstObj=_documents.FirstOrDefault(); } public override bool Read() @@ -28,7 +33,7 @@ namespace MongoDb.Ado.data return false; } - public override int FieldCount => _current?.Count()??0; + public override int FieldCount => _documents?.FirstOrDefault()?.Count()??0; public override int Depth => throw new NotImplementedException(); @@ -52,9 +57,15 @@ namespace MongoDb.Ado.data public override double GetDouble(int ordinal) => (double)GetValue(ordinal); public override Type GetFieldType(int ordinal) { - var obj = GetValue(ordinal); + var firstObj = _firstObj; + if(firstObj==null) return typeof(object); + var obj = firstObj.GetValue(ordinal); + if (obj is BsonObjectId) + { + return typeof(string); + } if (obj == null) return typeof(object); - return obj.GetType(); + return BsonTypeMapper.MapToDotNetValue(obj).GetType(); } public override float GetFloat(int ordinal) => (float)GetValue(ordinal); public override Guid GetGuid(int ordinal) => (Guid)GetValue(ordinal); @@ -80,11 +91,12 @@ namespace MongoDb.Ado.data public override string GetName(int ordinal) { - if (_current == null) - throw new InvalidOperationException("No current document."); + var firstObj=_firstObj; + if (firstObj == null) + return ""; // 获取当前文档的字段元素列表(Elements) - var elements = _current.Elements.ToList(); + var elements = firstObj.Elements.ToList(); // 确保 ordinal 是有效的索引 if (ordinal < 0 || ordinal >= elements.Count) @@ -96,8 +108,9 @@ namespace MongoDb.Ado.data public override int GetOrdinal(string name) { + var firstObj = _firstObj; int i = 0; - foreach (var elem in _current.Elements) + foreach (var elem in firstObj.Elements) { if (elem.Name.Equals(name, StringComparison.OrdinalIgnoreCase)) return i; diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/DbBind/MongoDbDbBind.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/DbBind/MongoDbDbBind.cs index 4a68933e9..4974f75ae 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/DbBind/MongoDbDbBind.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/DbBind/MongoDbDbBind.cs @@ -141,7 +141,30 @@ namespace SqlSugar.MongoDb // 结构体/Map类型(MongoDb 1.0+支持) new KeyValuePair("STRUCT", CSharpDataType.@object), // 需动态解析 - new KeyValuePair("MAP", CSharpDataType.@object) // 键值对 + new KeyValuePair("MAP", CSharpDataType.@object), // 键值对 + + new KeyValuePair("INT16", CSharpDataType.@short), // CLR short + new KeyValuePair("UINT16", CSharpDataType.@short), // CLR ushort + new KeyValuePair("INT32", CSharpDataType.@int), // CLR int + new KeyValuePair("UINT32", CSharpDataType.@int), // CLR uint + new KeyValuePair("INT64", CSharpDataType.@long), // CLR long + new KeyValuePair("UINT64", CSharpDataType.@long), // CLR ulong + new KeyValuePair("BYTE", CSharpDataType.@byte), // CLR byte + new KeyValuePair("SBYTE", CSharpDataType.@sbyte), // CLR sbyte + new KeyValuePair("SINGLE", CSharpDataType.@float), // CLR float (Single) + new KeyValuePair("DECIMAL", CSharpDataType.@decimal), // CLR decimal + new KeyValuePair("DATETIMEOFFSET", CSharpDataType.@DateTimeOffset), // CLR DateTimeOffset + new KeyValuePair("DATETIME", CSharpDataType.@DateTime), // CLR DateTime + new KeyValuePair("BOOLEAN", CSharpDataType.@bool), // CLR bool + new KeyValuePair("STRING", CSharpDataType.@string), // CLR string + new KeyValuePair("GUID", CSharpDataType.@Guid), // CLR Guid + new KeyValuePair("ENUM", CSharpDataType.@enum), // CLR enum + new KeyValuePair("OBJECT", CSharpDataType.@object), // CLR object + new KeyValuePair("OTHER", CSharpDataType.@other), // custom/unknown + new KeyValuePair("BYTE[]", CSharpDataType.@byteArray), // CLR byte[] + new KeyValuePair("TIME", CSharpDataType.@time), // possibly TimeOnly + new KeyValuePair("TIMESPAN", CSharpDataType.@TimeSpan), // CLR TimeSpan + new KeyValuePair("CHAR", CSharpDataType.@char), // CLR char }; public override List StringThrow { diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/DuckDBProvider.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/DuckDBProvider.cs index 6be579cca..79fefe286 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/DuckDBProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/DuckDBProvider.cs @@ -95,7 +95,7 @@ namespace SqlSugar.MongoDb public override void SetCommandToAdapter(IDataAdapter adapter, DbCommand command) { - throw new NotImplementedException(); + ((MongoDbDataAdapter)adapter).SelectCommand =(MongoDbCommand)command; } public override DbCommand GetCommand(string sql, SugarParameter[] pars)