새 드라이버를 사용하기 위해 이전 레거시 MongoDB 드라이버의 일부 코드를 이식하고 있으며 문제가 발생했습니다. 공통 기본 클래스의 여러 파생 된 형식을 포함하는 컬렉션이 있습니다. 이전에는 파생 클래스 속성을 사용하여 컬렉션 (기본 형식을 사용하여 선언 된)을 쿼리하고 파생 클래스 문서를 검색 할 수있었습니다. 그래서 이러한 클래스를 제공 : 잘 작동MongoDB C# 드라이버를 사용하여 파생 형식 값 쿼리
MongoCollection<Animal> animals = db.GetCollection<Animal>("Animals");
var q = Query<Cat>.EQ(c => c.LikesFish, true);
var catsThatLikeFish = animals.FindAs<Animal>(q).ToList();
:
[BsonDiscriminator(RootClass = true)]
[BsonKnownTypes(typeof(Cat),typeof(Dog))]
class Animal
{
[BsonId(IdGenerator = typeof(StringObjectIdGenerator))]
public string Id { get; set; }
public string Name { get; set; }
}
class Cat : Animal
{
public bool LikesFish { get; set; }
}
class Dog : Animal
{
public string FavouriteBone { get; set; }
}
나는 다음과 같은 일을 할 수 있습니다.
지금 그러나 나는 필터를 입력 할 필요가 더 이상 컴파일 할 수 없습니다 :
IMongoCollection<Animal> animals = db.GetCollection<Animal>("Animals");
var query = Builders<Cat>.Filter.Eq(c => c.LikesFish, true);
var catsThatLikeFish = animals.FindSync(query);
을이 오류 얻을 : 새로운 드라이버를 사용 가능한 더 이상
Error CS0411 The type arguments for method 'IMongoCollection<Animal>.FindSync<TProjection>(FilterDefinition<Animal>, FindOptions<Animal, TProjection>, CancellationToken)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
이인가를? 이 컬렉션의 일반적인 쿼리를 허용하는 클래스가 있으며 지금 당장은 우아한 방법을 볼 수 없습니다.
편집 :
슬프게도 별도의 컬렉션은 우리가 같은 쿼리를 사용하여 다른 유형을 끌어 필터 식을 혼합 같은 비 스타터입니다. 위의이 같은 "개와 고양이"의 예에서 :
var catQuery = Query<Cat>.EQ(c => c.LikesFish, true);
var dogQuery = Query<Dog>.EQ(c => c.FavouriteBone, "Beef");
var q = Query.Or(catQuery, dogQuery);
var catsThatLikeFishOrDogsThatLikeBeef = animals.FindAs<Animal>(q).ToList();
나는 "nameof"방법 위에서 살펴 보겠습니다 - 작동 할 수 있지만 나에게 옛날 방식의 우아함이 부족한 것 같다. ..
많은 도움을 주셨습니다.
감사합니다,
스티브
아래의 Maksim의 답변 외에도 새로운 API에는 OfType() 메서드가 있습니다. IMdogs = db.GetCollection ("동물") OfType (). –