Драйвер MongoDB C #, получение элементов путем проецирования списка в атрибутах модели - PullRequest
1 голос
/ 25 сентября 2019

У меня есть коллекция объектов, которая содержит свойство типа List, где Luggage имеет следующую структуру:


    public class Luggage
    {
        public float MaxWeight { get; set; }
        public LuggageType Type { get; set; }
    }


    public class MyObject
    {
        public List<Luggage> Luggages{get;set;}

    }

, где LuggageType - это перечисление.Учитывая, что у меня есть список типов багажа

List<LuggageType> LuggageTypes

Как я могу получить каждый Объект в моей коллекции Объектов, в багаже ​​которых содержится багаж, присутствующий в Списке типов багажа.

Я пробовал несколько решений, но нижеизложенное - самое близкое к решению.

Вот фильтр, который я создал, чтобы получить то, что я хотел:

Builders<MyObject>.Filter.AnyIn<LuggageType>(a => a.Luggages.Select(l => l.Type), annEntityaAttr.LuggageTypes);

Проблема в том, что MongoDB возвращает сообщение об ошибке, в котором говорится, что он не может вычислить выражение a => a.Luggages.Select(l => l.Type) Так что я не понимаю, поскольку это Linq, хотя это должно сработать.Думаю, мне понадобится какая-то проекция, но я прочитал документы и не нашел способа проецировать свойство запрашиваемого элемента

1 Ответ

0 голосов
/ 27 сентября 2019

это можно сделать следующим образом.Стоит отметить, что вам нужно привести значения перечисления к IEnumerable<LuggageType>, чтобы мы могли использовать расширение Contains().

Код ниже использует MongoDB.Entities для краткости, но для запросачасть такая же для официального водителя.просто замените DB.Queryable<MyObject>() на collection.AsQueryable()

using MongoDB.Entities;
using System;
using System.Collections.Generic;
using System.Linq;

namespace StackOverflow
{
    public class MyObject : Entity
    {
        public List<Luggage> Luggages { get; set; }
    }

    public class Luggage
    {
        public float MaxWeight { get; set; }
        public LuggageType Type { get; set; }
    }

    public enum LuggageType
    {
        One = 1,
        Two = 2,
        Three = 3
    }

    public class Program
    {
        private static void Main(string[] args)
        {
            new DB("test", "localhost");

            (new MyObject
            {
                Luggages = new List<Luggage>
                {
                    new Luggage
                    {
                        MaxWeight = 12.345f,
                        Type = LuggageType.Three
                    },
                    new Luggage
                    {
                        MaxWeight = 12.345f,
                        Type = LuggageType.Two
                    }
                }
            }).Save();

            var enumValues = Enum.GetValues(typeof(LuggageType)).Cast<LuggageType>();

            var result = DB.Queryable<MyObject>()
                           .Where(o => o.Luggages.Any(l => enumValues.Contains(l.Type)))
                           .ToList();
        }
    }
}
...