我是使用linq的新手,遇到了一些问题。我有一大批A型收藏品和一小批B型收藏品。 我希望A中“ id”确实存在于B中的项目列表。 因此,这就是我认为可行的方法:
List<string> list = collection_A
.Where(c => collection_B.Any(x => x.MessageId == c.Id))
.Select(c=>c.Id)
.ToList();
我在.Net中使用mongoDB linq提供程序,错误是:System.ArgumentException:不支持的过滤器。关系是1-1
实际上,我不知道在这种情况下还是应该使用“加入”。
答案 0 :(得分:1)
我建议您尝试一下:
var messageIds = new HashSet<string>(collection_B.Select(x => x.MessageId).Distinct());
List<string> list =
collection_A
.Where(c => messageIds.Contains(c.Id))
.Select(c => c.Id)
.ToList();
答案 1 :(得分:0)
如果我正确理解了您的问题,以下代码将为您指明正确的方向。 我已经使用MongoDAL进行数据访问,这只是c#驱动程序的抽象。
using System;
using System.Linq;
using MongoDAL;
namespace Example
{
class Person : Entity
{
public string Name { get; set; }
}
class BanRecord : Entity
{
public One<Person> Person { get; set; }
public string ReasonForBan { get; set; }
}
class Program
{
static void Main(string[] args)
{
new DB("testdatabase");
var person1 = new Person { Name = "Person One" };
var person2 = new Person { Name = "Person Two" };
var person3 = new Person { Name = "Person Three" };
person1.Save();
person2.Save();
person3.Save();
var ban1 = new BanRecord
{
Person = person1.ToReference(),
ReasonForBan = "Cause we can!"
};
ban1.Save();
var ban2 = new BanRecord
{
Person = person2.ToReference(),
ReasonForBan = "Cause we can!"
};
ban2.Save();
var bannedPeople = (from b in DB.Collection<BanRecord>()
join p in DB.Collection<Person>() on b.Person.ID equals p.ID into banned
from p in banned
select p).ToArray();
Console.ReadKey();
}
}
}