1

次の生徒と教師の簡単な例を考えてみましょう。

// person
public class Person
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public Person() {
        Id = ObjectId.GenerateNewId(DateTime.Now);
    }
}

// student has a Classroom
public class Student : Person
{
    public string Classroom { get; set; }
}

// teacher has a Dictionary<ObjectId, Student> Students
public class Teacher : Person
{
    [BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)]
    public Dictionary<ObjectId, Student> Students { get; set; }
    public Teacher() {
        Students = new Dictionary<ObjectId, Student>();
    }
}

class Program
{
    static void Main(string[] args)
    {

        var server = MongoServer.Create("mongodb://localhost/database?safe=true");
        var database = server.GetDatabase("sandbox");
        var collection = database.GetCollection<Teacher>("teachers");
        collection.Drop();

        // create students
        var s1 = new Student() { Name = "s1", Classroom = "foo" };
        var s2 = new Student() { Name = "s2", Classroom = "foo" };
        var s3 = new Student() { Name = "s3", Classroom = "baz" };
        var s4 = new Student() { Name = "s4", Classroom = "foo" };

        // teacher 1
        var t1 = new Teacher() { Name = "t1" };
        t1.Students.Add(s1.Id, s1);
        t1.Students.Add(s2.Id, s2);
        collection.Insert(t1);

        // teacher 2
        var t2 = new Teacher {Name = "t2"};
        t2.Students.Add(s3.Id, s3);
        collection.Insert(t2);

        // add teacher 3 
        var t3 = new Teacher() {Name = "t3"};
        t3.Students.Add(s4.Id, s4);
        collection.Insert(t3);

        // select via key
        var onlyt1 = collection.AsQueryable().Where(t => t.Students.ContainsKey(s1.Id)).ToList();

        Console.WriteLine("onlyt1 : {0}", onlyt1.ToJson());
        Console.ReadLine();
    }
}

上記のキーで選択できますが、教室が「foo」の生徒がいるすべての教師を見つけるにはどうすればよいですか? 私は次のようなものを書きたいです。

// select via value
var shouldBeJustT1andT3 = collection.AsQueryable().Where(t => t.Students.Values.Where(s => s.Classroom == "foo")).ToList(); 
4

2 に答える 2

2

Anyを使用して、指定された教室 "foo" に生徒がいる教師を取得できます。

List<Teacher> shouldBeJustT1andT3 = collection.Where(
    teacher => teacher.Students.Any(student => student.Classroom == "foo")
).ToList(); 

編集

Mongo の IQueryable はデフォルトでAnyをサポートしていないため、次の代わりにWhereandを使用できます。CountAny

List<Teacher> shouldBeJustT1andT3 = collection.Where(
    teacher => teacher.Students.Where(student => student.Classroom == "foo").Count() > 0
).ToList(); 
于 2012-11-29T22:43:30.380 に答える
0

Studentsだけのタイプを持つことはできませんICollection<Person>か?

次に、クエリ辞書の値は必要ありませんが、フラット オブジェクトのリスト、つまりwhere s.ID == x && s.Classroom == "blah".

ディクショナリは、キーのみでオブジェクトを見つけるのが理にかなっていますt.Students[studentId]


教師を見つけるには: dbaseman の回答を参照してください。彼は正しいです。

于 2012-11-29T22:44:08.973 に答える