Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Linq导入SQL列表到MongoDB_C#_Linq_Mongodb_Linq To Sql_Import - Fatal编程技术网

C# 将Linq导入SQL列表到MongoDB

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

我有一个非常简单的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 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()
以获取具有该值的列表或数组。您没有列表作为开始。您有一个查询对象,当您枚举它时,它将返回一个项目列表