【问题标题】:MongoDB C# Driver, Getting Elements By Projecting List in Model's attributesMongoDB C# 驱动程序,通过在模型的属性中投影列表来获取元素
【发布时间】:2020-01-25 11:10:47
【问题描述】:

我有一个对象集合,其中包含一个 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&lt;LuggageType&gt; LuggageTypes

如何获取我的对象集合中的每个对象,这些对象的行李包含行李类型列表中存在的行李。

我尝试了几种解决方案,但下面是我认为最接近解决方案的一种。

这是我为检索我想要的内容而创建的过滤器:

Builders&lt;MyObject&gt;.Filter.AnyIn&lt;LuggageType&gt;(a =&gt; a.Luggages.Select(l =&gt; l.Type), annEntityaAttr.LuggageTypes);

问题是,MongoDB 返回一条错误消息,指出它无法计算表达式 a =&gt; a.Luggages.Select(l =&gt; l.Type) 所以我不明白,因为它是 Linq 我虽然这应该只是工作。 我想我需要某种投影,但我阅读了文档并没有找到一种方法来投影要查询的元素的属性

【问题讨论】:

    标签: c# mongodb projection


    【解决方案1】:

    可以如下进行。需要注意的是,您需要将枚举值转换为 IEnumerable&lt;LuggageType&gt;,以便我们可以使用 Contains() 扩展。

    下面的代码使用 MongoDB.Entities 为简洁起见,但查询部分与官方驱动程序相同。只需将DB.Queryable&lt;MyObject&gt;() 替换为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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-06
      • 2018-11-16
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 2015-06-25
      相关资源
      最近更新 更多