2017-03-27 25 views
0

我有两个集合,它存储两个不同的对象(每个对象表示一个对象),它们从同一个对象继承。c#mongodb找到派生对象的派生对象

喜欢的东西:

public abstract class BaseClass 
{ 
    public string name = "someName"; 
} 

public class FirstClass : BaseClass { ... } 
public class SecondClass : BaseClass { ... } 

var FirstCollection = mongo.GetCollection<FirstClass>("First"); 
var SecondClass = mongo.GetCollection<SecondClass>("Second"); 

现在,我有一个查询,以在两个集合运行,仅使用公共字段。 我想使用相同的查询,使用“MongoDB.Driver.Builders”。

喜欢的东西:

var filter = Builders<BaseClass>.Filter.Where(y => y.name == "someName"); 
var result = FirstCollection.Find(filter); 

任何想法如何能做到呢?

回答

0

通过以下设置,您可以或多或少地完成与已经完成的操作相同的操作。这是上下文:

public class Context 
{ 
    public const string DATABASE_NAME = "Test"; 
    public const string FIRST_COLLECTION_NAME = "FirstCollection"; 
    public const string SECOND_COLLECTION_NAME = "SecondCollection"; 

    private static readonly IMongoClient _client; 
    private static readonly IMongoDatabase _database; 
    static Context() 
    { 
     var connectionString = ConfigurationManager.AppSettings["MongoDbServer"]; 
     _client = new MongoClient(connectionString); 
     _database = _client.GetDatabase(DATABASE_NAME); 
    } 

    public IMongoClient Client => _client; 

    public IMongoCollection<First> FirstCollection => 
     _database.GetCollection<First>(FIRST_COLLECTION_NAME); 

    public IMongoCollection<Second> SecondCollection => 
     _database.GetCollection<Second>(SECOND_COLLECTION_NAME); 
} 

FirstSecondBase类是一样的你。然后,你可以找到你的文件是这样的:

var context = new Context(); 
var builder = Builders<First>.Filter; 
var filter = builder.Eq(x => x.Name, "Paul"); 
//You can insert like this: 
//context.FirstCollection.InsertOne(new First(){Name = "Paul", Age = 33}); 
var result = context.FirstCollection.Find(filter).ToList(); 

更新

你的编辑后,我能想到的唯一的办法是这样的:

var result = context.FirstCollection.Find(x=> x.Name == "Paul").ToList(); 
+0

我做了一个错误,我的问题。 我想要的是使用这个构建器:建设者。 我也编辑了qustion。 – AvrahamL