LINQ查询非现有字段

时间:2017-06-13 16:28:02

标签: c# mongodb linq

我正在尝试使用LINQ查询mongodb集合。 我的文档具有以下结构:

{ 
    "_id": ObjectId("593fe10f37ce000d844e8972"),
    "MRN": "00038063"
    "Family_Name": "SALAMOUN"
    "First_Name": "SABINE"
    "Maiden_Name": ""
    "Mother_Name": "RANDA"
    "Spouse_Name": ""
    "Address": "Naccache"
}

从C#方面,我创建了一个具有以下结构的类:

public class cls_Patient{ 
    public string MRN;
    public string Family_Name;
    public string First_Name;
    public string Father_Name; 
    public string Spouse_Name;
    public string Address;
} 

注意,MongoDB文档中缺少father_name字段,并在类级别创建为字段,以模拟数据模型更改(同一集合中的文档可能具有不同的结构

查询代码:

var client = new MongoClient("mongodb://183.183.183.122");
var db = client.GetDatabase("HISEA");
var col2 = db.GetCollection<cls_Patient>("tbl_Patients");

var names = col2.AsQueryable().
  Where(patient => patient.MRN == MFNO &&patient.Father_Name != "")
    .OrderBy(patient => patient.First_Name)
    .ThenBy(patient => patient.Family_Name);

最新的指令查询了father_name字段并抛出以下异常:

  

“找不到匹配的创作者”

我尝试过使用

 BsonClassMap.RegisterClassMap<cls_Patient>(cm =>
  {
    cm.AutoMap();
    cm.SetIgnoreExtraElements(true);
  }); 

我也用过

MongoDB.Bson.Serialization.Attributes.BsonIgnoreExtraElements] 

在类定义之上,但两种方法都不起作用。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

这是一个有效的例子。请注意,我无法使用您提供的代码重现您的错误消息。

如果您拥有上面发布的数据库中的确切数据,那么MongoDB查询将产生一个结果。这似乎有点令人惊讶,但它是有道理的,因为您的示例数据没有&#34; Father_Name&#34;领域。所以,当你要求所有患者使用&#34; Father_Name&#34;值不等于空字符串(patient.Father_Name != "")MongoDB会找到你的记录,因为它的&#34; Father_Name&#34;值不存在,因此不等于空字符串。

using MongoDB.Bson.Serialization.Conventions;
using MongoDB.Driver;
using System;
using System.Linq;

namespace ConsoleApp1
{
    public class cls_Patient
    {
        public string MRN;
        public string Family_Name;
        public string First_Name;
        public string Father_Name;
        public string Spouse_Name;
        public string Address;
    }

    public class Program
    {
        static void Main(string[] args)
        {
            ConventionPack p = new ConventionPack();
            p.Add(new IgnoreExtraElementsConvention(true));
            ConventionRegistry.Register("Ignore extra elements", p, _ => true);

            var collection = new MongoClient().GetDatabase("test").GetCollection<cls_Patient>("Person");

            var names = collection.AsQueryable().
              Where(patient => patient.MRN == "00038063" && patient.Father_Name != "")
                .OrderBy(patient => patient.First_Name)
                .ThenBy(patient => patient.Family_Name).ToList();

            Console.ReadLine();
        }
    }
}