我是新手使用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
实际上我不知道在这种情况下是否应该使用“加入”或其他内容。
我建议你试试这个:
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();
如果我理解你的问题,下面的代码将指出你正确的方向。我使用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();
}
}
}