2015-11-03 29 views
3

我無法通過ObjectID獲取GridFSFileInfo,但獲得文件名 ,錯誤消息爲: 無法確定x => x.Id的序列化信息Mongodb:無法通過ObjectID獲取GridFSFileInfo,但按文件名取得成功

string objectID = ObjectIDTxt.Text.Trim(); 
GridFSBucketOptions bucketOptions = new GridFSBucketOptions(); 
bucketOptions.BucketName = "myBucket"; 

ObjectId gridfsObjectID = new ObjectId(objectID); 

//by filename will succeed 
//var filter = Builders<GridFSFileInfo>.Filter.Eq(x => x.Filename, "myfilename.pdf"); 
//by ObjectID will fail 
var filter = Builders<GridFSFileInfo>.Filter.Eq(x=>x.Id,gridfsObjectID); 

var findOptions = new GridFSFindOptions(); 
findOptions.Limit = 1; 

var myBucket = new GridFSBucket(_database, bucketOptions); 

using (var taskOfCursor = Task.Run(() => myBucket.FindAsync(filter, findOptions))) 
{ 
    var taskOfList = Task.Run(() => taskOfCursor.Result.ToListAsync()); 
    GridFSFileInfo fileInfo = taskOfList.Result.FirstOrDefault(); 
    if (fileInfo != null) 
    { 
     FileNameLbl.Text = fileInfo.Filename; 
    } 
} 

我正在使用Mongodb 3.0,c#驅動程序2.1,wird老虎存儲引擎。 請原諒我使用許多'Task.Run()',因爲出於某種原因,我需要同步調用異步mongo方法。 任何建議將不勝感激... THX

回答

5

無法確定內部對於x => x.Id

由於錯誤提示,則不能使用x.Id序列化信息您的查詢以這種方式。提供的lambda表達式用於檢索屬性的名稱,但它不明白x.Id是什麼。

你可以試試這個:

var filter = Builders<GridFSFileInfo>.Filter.Eq("_id", gridfsObjectID); 

它使用Eq方法this overload和字符串進行the implicit conversion到FieldDefinition。

表達式似乎有點令人費解爲我好,但你會發現與表達在回答這個問題的更多信息:Why would you use Expression> rather than Func?

+0

它的工作原理! Thx的答案和上面的其他信息。雖然它們對我來說似乎有點困難(特別是Eq和隱式轉換的鏈接)。我會花一些時間在他們身上。再次。 – ChiaChi

0

您可以直接在查找方法中添加lambda語法:

myBucket.FindAsync(x => x.Id == new MongoDB.Bson.ObjectId(objectID), findOptions) 
+0

我試過這個,並得到了編譯錯誤。錯誤信息:無法將lambda表達式轉換爲MongoDB.Driver.FilterDefinition ,因爲它不是委託。這是FindAsync的api:[link](http://api.mongodb.org/csharp/2.1/html/M_MongoDB_Driver_GridFS_GridFSBucket_FindAsync.htm)。 FindAsync似乎不接受lambda表達式參數。 – ChiaChi