Linq to mongodb:子查询条件中的意外行为

时间:2018-06-19 19:26:36

标签: c# mongodb linq mongodb-query

有一个班级人士,他认识几位作者,并且有一位受人欢迎的作者:

  public class Author
  {
    public string name;
    public string firstname;
  }

  public class Person
  {
    public string favoredAuthor;
    public Author[] knownAuthors;
  }

json呈现形式如下:

{
    "_id" : ObjectId("5b2955cf79cd67d3d09ddbe8"),
    "knownAuthors" : [ 
        {
            "name" : "Müllmann",
            "firstname" : "Dieter"
        }, 
        {
            "name" : "Marx",
            "firstname" : "Karl"
        }, 
        {
            "name" : "Hildebrandt",
            "firstname" : "Saftarsch"
        }
    ],
    "favoredAuthor" : "Marx"
}

我想使用以下linq表达式查询人喜欢的-Author-:

// gives no result:
var favoredAuthor = persons.AsQueryable()
    .Select(x => x.knownAuthors.Where(a => a.name == x.favoredAuthor))
     .FirstOrDefault();

如果我在“人员列表”上工作,则具有相同的作用:

// working (result is Author 'Karl Marx'):
var persons = new List<Person>() { new Person() }.AsQueryable();
var person = persons.Select(x => x.knownAuthors.Where(a => a.name == x.favoredAuthor).FirstOrDefault()) 
        .FirstOrDefault();

这是MongoDB官方驱动程序中的错误吗?还是我做错了? 我测试过   Visual Studio 2017   MongoDb驱动程序2.7.0以及2.6.1

任何想法,男孩和女孩?

1 个答案:

答案 0 :(得分:0)

MongoDB无法处理这样的两个字段。这是数据库系统的局限性。例如,请参见MongoDB : querying documents with two equal fields, $match and $eq和可能的解决方法(一定要了解性能成本)。

上一次遇到这种情况时,我们记录了整个情况,并确保从服务器获取数据集后,将foo == bar条件与LINQ-to-Objects一起应用。