C# 将Linq导入SQL列表到MongoDB
我有一个非常简单的LinqToSql列表C# 将Linq导入SQL列表到MongoDB,c#,linq,mongodb,linq-to-sql,import,C#,Linq,Mongodb,Linq To Sql,Import,我有一个非常简单的LinqToSql列表 var list = DB.Where(c => c.Status.Equals("active")).Select(c => c.Name); 我正在尝试将该列表导入MongoDB。以下是我目前掌握的情况: const string connectionString = "mongodb://localhost"; var client = new MongoClient(connectionString); MongoServer se
var list = DB.Where(c => c.Status.Equals("active")).Select(c => c.Name);
我正在尝试将该列表导入MongoDB。以下是我目前掌握的情况:
const string connectionString = "mongodb://localhost";
var client = new MongoClient(connectionString);
MongoServer server = client.GetServer();
MongoDatabase database = server.GetDatabase("test");
var collection = database.GetCollection("salesppl");
collection.Insert(list);
我也尝试过InsertBatch和Save,但没有成功。以下是我收到的每个错误消息:
插入批次
BsonSerializationException:序列化程序StringSerializer所需的序列化选项类型为RepresentationSerializationOptions,而不是DocumentSerializationOptions
插入
BsonSerializationException:序列化程序枚举序列化程序所需的序列化选项类型为ArraySerializationOptions,而不是DocumentSerializationOptions
拯救
InvalidOperationException:Save只能用于具有Id的文档
注意:我不认为这有任何关联,但我是通过LinqPad这样做的
那么,如何将此列表保存到MongoDb?我刚刚发现我的salesppl字符串列表不能存储为顶级项。我需要使用类来持久化列表,或者使用BsonDocument 以下是对我有效的代码:
var list = DB.Where(c => c.Status.Equals("active"))
.Select(c => new BsonDocument("name", c.Name))
.ToList();
那么对于MongoDB中的集合,我需要使用:
collection.InsertBatch(list);
我现在更新的代码如下所示:
var list = DB.Where(c => c.Status.Equals("active"))
.Select(c => new BsonDocument("name", c.Name))
.ToList();
const string connectionString = "mongodb://localhost";
var client = new MongoClient(connectionString);
MongoServer server = client.GetServer();
MongoDatabase database = server.GetDatabase("test");
var collection = database.GetCollection("salesppl");
collection.InsertBatch(list);
MongoDB是一个文档数据库。集合保存一组文档,其中文档是一组键值对。简单字符串不是有效的文档(请参阅)。它甚至不是有效的BSON元素,因为它没有键。它只是一个没有键的值。这就是您保存字符串的尝试失败的原因。这就是为什么创建包含单个元素的有效文档(将字符串作为值)解决了您的问题
以下是您的例外情况的详细说明。Mongo如何插入文档
- 它获取文档类型
- 它搜索此类型的序列化程序
- 它将文档序列化为二进制数据
- 它将二进制数据发送到数据库
collection.InsertBatch(list);
理论上,字符串也可以被视为文档。它具有属性Length
,可以序列化为{Length:42}
文档。但你会看到例外:
BsonSerializationException:应为序列化程序StringSerializer
RepresentationSerializationOptions类型的序列化选项,而不是
DocumentSerializationOptions
字符串是BSON元素值类型之一。因此,为字符串值序列化定义了StringSerializer
。当Mongo试图序列化您插入的文档时,它会搜索文档类型序列化程序。并查找StringSerializer
。但这个序列化程序应该用于字符串元素的序列化,而不是文档,您会看到异常
下一种情况是将字符串列表作为单个文档插入:
collection.Insert(list);
在这种情况下,传递的文档的类型是IEnumerable
,并且还存在适当的序列化程序,用于序列化数组类型的元素。同样,您会看到关于错误的serialier用法的异常:
BsonSerializationException:应为序列化程序EnumerableSerializer
ArraySerializationOptions类型的序列化选项,而不是
DocumentSerializationOptions
最后一个错误很简单
collection.Save(list);
此方法只能用于具有Id字段的文档。在插入或更新文档之前,Mongo尝试获取Id值。但是字符串和字符串列表都没有Id。您会看到“找不到IdGenerator”异常。您遇到了什么问题?您所称的
list
实际上是一个带有IEnumerable接口的查询。您必须枚举查询以获取实际值(例如使用foreach),或者调用.ToList()
或.ToArray()
以获取具有该值的列表或数组。您没有列表作为开始。您有一个查询对象,当您枚举它时,它将返回一个项目列表