在Linq MongodbDriver中的“Where”方法中使用“Any”方法的问题

问题描述 投票:1回答:2

我是新手使用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

实际上我不知道在这种情况下是否应该使用“加入”或其他内容。

c# linq mongodb-.net-driver
2个回答
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();

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();
        }
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.