Проблема с использованием метода «Any» внутри метода «Where» в Linq MongodbDriver - PullRequest
1 голос
/ 23 апреля 2019

Я новичок в использовании linq и у меня возникли проблемы.У меня есть большая коллекция типа A и небольшая коллекция типа B. Я хочу, чтобы список элементов в A, где их «идентификатор» действительно существовал в B. Так вот, что я действительно мог бы сработать:

List<string> list = collection_A
                .Where(c => collection_B.Any(x => x.MessageId == c.Id))
                .Select(c=>c.Id)
                .ToList();

Я использую провайдер mongoDB linq в .Net, и ошибка: System.ArgumentException: неподдерживаемый фильтр.Соотношение 1-1

На самом деле я не знаю, следует ли мне использовать «Присоединиться» в этом случае или что-то еще.

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Я бы посоветовал вам попробовать это:

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 голосов
/ 24 апреля 2019

Если я правильно понял вашу проблему, следующий код укажет вам правильное направление.я использовал 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();
        }
    }
}

...