如何使用Linq将带有字符串[]的MongoDB集合连接到带有字符串的集合上



我正在尝试加入两个集合。我设法在连接部分类型相同的情况下正确地连接了这两个部分,但这不是目标。困难的出现是因为我在其中一个集合中有一个字符串列表(id(,我想用另一个集合的对象替换该列表中的每个字符串,该集合是定义为的用户集合

public string name { get; set; }
public string email { get; set; }
public string _id { get; set; }
public bool IsDeleted { get; set; }

我有两种类型的会议,我想在其中插入用户来替换字符串,因此这是一个DTO。

public class MeetingBase : ModelBase
{
public string createdBy { get; set; }
public string facilitator { get; set; }
public string topic { get; set; }
public string address { get; set; }
public string city { get; set; }
public string country { get; set; }
public int RoomNumber { get; set; }
public DateTime meetingDate { get; set; }
}
public class Meeting : MeetingBase
{
public List<string> attendees { get; set; }
}
public class MeetingDTO : MeetingBase
{
public List<User> attendees { get; set; }
}

如上所述,我想将Meeting的集合与users的集合连接起来,从而生成MeetingDTO的的集合

到目前为止,我最好的尝试是:

public async Task<List<MeetingDTO>> getMeetingDtos(string userid)
{
var userCollection = _userDataManager.GetDataContext().MongoCollection;
var meetingCollection = _meetingDataManager.GetDataContext().MongoCollection;
var query = from m in meetingCollection.AsQueryable()
where (m.createdBy == userid)
from attendee in m.attendees
join u in userCollection.AsQueryable() on attendee equals u._id into meetingusers
select new MeetingDTO()
{
_id = m._id,
IsDeleted = m.IsDeleted,
attendees = meetingusers.ToList(),
address = m.address,
city = m.city,
country = m.country,
createdBy = m.createdBy,
facilitator = m.facilitator,
meetingDate = m.meetingDate,
RoomNumber = m.RoomNumber,
topic = m.topic
};
var result = query.ToList();
return result;
}

但是,此尝试会产生以下运行时异常System.NotSupportedException: '$project or $group does not support {document}.'

您可以使用集合的.Aggregate()接口来完成,如下所示:

var meetingDTOs = meetingCollection.Aggregate()
.Match(m => m.createdBy == userid)
.Lookup<Meeting, User, MeetingDTO>(
userCollection,
m => m.attendees,
u => u.Id,
dto => dto.attendees)
.ToList();

测试程序:

using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;
using MongoDB.Entities;
using MongoDB.Entities.Core;
using System.Collections.Generic;
using System.Linq;
namespace StackOverFlow
{
public class User : Entity
{
public string name { get; set; }
}
public class MeetingBase : Entity
{
public string createdBy { get; set; }
public string topic { get; set; }
}
public class Meeting : MeetingBase
{
[BsonRepresentation(BsonType.ObjectId)]
public List<string> attendees { get; set; }
}
public class MeetingDTO : MeetingBase
{
public List<User> attendees { get; set; }
}
public static class Program
{
private static void Main()
{
new DB("test");
var user1 = new User { name = "user one" };
var user2 = new User { name = "user two" };
new[] { user1, user2 }.Save();
var meeting = new Meeting
{
attendees = new List<string> { user1.ID, user2.ID },
createdBy = "god",
topic = "corona beer"
};
meeting.Save();
var meetingDTOs = DB.Fluent<Meeting>()
.Match(m => m.createdBy == "god")
.Lookup<Meeting, User, MeetingDTO>(
DB.Collection<User>(),
m => m.attendees,
u => u.ID,
dto => dto.attendees)
.ToList();
}
}
}

最新更新