Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C中的buildr在mongo DB中过滤嵌入列表#_C#_Mongodb - Fatal编程技术网

C# 使用C中的buildr在mongo DB中过滤嵌入列表#

C# 使用C中的buildr在mongo DB中过滤嵌入列表#,c#,mongodb,C#,Mongodb,我在用C#编写查询时遇到问题。 Hee是我的数据模型: public class SpamEntity:MongoEntity { public IList<MessageData> MessageData { get; set; } } public class MessageData { public IList<string> EmbeddedLinks { get; set; } } 我想过滤那些文档,使其嵌入链接列表不为空(计

我在用C#编写查询时遇到问题。 Hee是我的数据模型:

    public class SpamEntity:MongoEntity
{
    public IList<MessageData> MessageData { get; set; }

}

public class MessageData
{

    public IList<string> EmbeddedLinks { get; set; }


}
我想过滤那些文档,使其嵌入链接列表不为空(计数或长度为零),并且与MyLink完全相同。 我已经半途而废了,我不知道接下来该怎么办。 我的过滤器类似于:

            var filter =
                Builders<SpamEntity>.Filter.ElemMatch(s => s.MessageData,
                    s => s.EmbeddedLinks != null  && s.EmbededLinks == ???);
我也不能使用计数:
s.EmbeddedLinks.count
=>它不起作用


有人能帮我吗?

不确定mongodb特定的过滤器。。 下面是一个linq变体(假设顺序无关紧要!)

工作代码

using System.Collections.Generic;
using System.Linq;
using Xunit;

 namespace SOProject
{
public class SpamEntity
{
    public IList<MessageData> MessageData { get; set; }

}
public class MessageData
{
    public IList<string> EmbeddedLinks { get; set; }

}
public class SO
{
    [Fact]
    public void Q_63081601()
    {
        var myLinks = new List<string> { "a.com", "b.com", "c.com" };
        var size = myLinks.Count();

        var data2 = new List<string>(myLinks);
        var data3 = new List<string>(myLinks) { "sdsadsad.com" };
        var data4 = new List<string> { "c.com", "b.com", "a.com" };

        var spamEntities = new SpamEntity()
        {
            MessageData = new List<MessageData>
            {
                new MessageData()
                {
                    EmbeddedLinks = new List<string> { "", "aaaa.com", "bbb.com" }
                },
                new MessageData()
                {
                    EmbeddedLinks = data2
                },
                new MessageData
                {
                    EmbeddedLinks = Enumerable.Empty<string>().ToList()
                },
                new MessageData()
                {
                    EmbeddedLinks = data2
                },
                new MessageData()
                {
                    EmbeddedLinks = data3
                },
                new MessageData()
                {
                    EmbeddedLinks = data4
                }
            }
        };

        var filtered =
            spamEntities.MessageData.Where(
                m =>
                m.EmbeddedLinks.Any() && //ensure EmbeddedLinks has some values
                m.EmbeddedLinks.Count() == myLinks.Count() && //and that count is same as our reference collection
                m.EmbeddedLinks.Intersect(myLinks).Count() == myLinks.Count()); //ensure elements match
        Assert.True(filtered.Any());
        Assert.Equal(3, filtered.Count());
    }
}
 }
使用System.Collections.Generic;
使用System.Linq;
使用Xunit;
名称空间SOProject
{
公共类空间
{
公共IList消息数据{get;set;}
}
公共类消息数据
{
公共IList嵌入链接{get;set;}
}
公开课
{
[事实]
公共无效Q_63081601()
{
var myLinks=新列表{“a.com”、“b.com”、“c.com”};
var size=myLinks.Count();
var data2=新列表(MyLink);
var data3=新列表(myLinks){“sdsadsad.com};
var data4=新列表{“c.com”、“b.com”、“a.com”};
var spamEntities=新spamEntities()
{
MessageData=新列表
{
新消息数据()
{
EmbeddedLinks=新列表{“”,“aaaa.com”,“bbb.com”}
},
新消息数据()
{
EmbeddedLinks=data2
},
新消息数据
{
EmbeddedLinks=Enumerable.Empty().ToList()
},
新消息数据()
{
EmbeddedLinks=data2
},
新消息数据()
{
EmbeddedLinks=data3
},
新消息数据()
{
EmbeddedLinks=data4
}
}
};
var滤波=
spamEntities.MessageData.Where(
m=>
m、 EmbeddedLinks.Any()&&//确保EmbeddedLinks有一些值
m、 EmbeddedLinks.Count()==myLinks.Count()&&&//并且该计数与我们的引用集合相同
m、 EmbeddedLinks.Intersect(myLinks.Count()==myLinks.Count());//确保元素匹配
Assert.True(filtered.Any());
Assert.Equal(3,filtered.Count());
}
}
}

谢谢,是的,我可以用LINQ。我一直在使用过滤器。好吧,祝你好运,我没有经验。。我希望mongodb客户端LIB具有某种linq表达式支持:)
s.EmbededLinks == myLinks
var filtered =
            spamEntities.MessageData.Where(
                m =>
                m.EmbeddedLinks.Any() && //ensure EmbeddedLinks has some values
                m.EmbeddedLinks.Count() == myLinks.Count() && //and that count is same as our reference collection
                m.EmbeddedLinks.Intersect(myLinks).Count() == myLinks.Count()); //ensure elements match
using System.Collections.Generic;
using System.Linq;
using Xunit;

 namespace SOProject
{
public class SpamEntity
{
    public IList<MessageData> MessageData { get; set; }

}
public class MessageData
{
    public IList<string> EmbeddedLinks { get; set; }

}
public class SO
{
    [Fact]
    public void Q_63081601()
    {
        var myLinks = new List<string> { "a.com", "b.com", "c.com" };
        var size = myLinks.Count();

        var data2 = new List<string>(myLinks);
        var data3 = new List<string>(myLinks) { "sdsadsad.com" };
        var data4 = new List<string> { "c.com", "b.com", "a.com" };

        var spamEntities = new SpamEntity()
        {
            MessageData = new List<MessageData>
            {
                new MessageData()
                {
                    EmbeddedLinks = new List<string> { "", "aaaa.com", "bbb.com" }
                },
                new MessageData()
                {
                    EmbeddedLinks = data2
                },
                new MessageData
                {
                    EmbeddedLinks = Enumerable.Empty<string>().ToList()
                },
                new MessageData()
                {
                    EmbeddedLinks = data2
                },
                new MessageData()
                {
                    EmbeddedLinks = data3
                },
                new MessageData()
                {
                    EmbeddedLinks = data4
                }
            }
        };

        var filtered =
            spamEntities.MessageData.Where(
                m =>
                m.EmbeddedLinks.Any() && //ensure EmbeddedLinks has some values
                m.EmbeddedLinks.Count() == myLinks.Count() && //and that count is same as our reference collection
                m.EmbeddedLinks.Intersect(myLinks).Count() == myLinks.Count()); //ensure elements match
        Assert.True(filtered.Any());
        Assert.Equal(3, filtered.Count());
    }
}
 }