在子句MongoDB和LINQ中的哈希检查方法

时间:2014-01-21 22:20:10

标签: c# linq mongodb linq-query-syntax

我有一个包含图像和DCT哈希的集合。如何在LINQ where子句中使用Similarity(long hash,long hashOther)方法仅选择类似的图像 此查询无效:

var results = imageCollection
.AsQueryable()
.Where(x=>ImageHash.Similarity(x.Hash, hash) >= 50)
.ToList();

发生序列化错误。

谢谢!

2 个答案:

答案 0 :(得分:1)

请记住,您针对MongoDB编写的任何LINQ查询最终都必须转换为MongoDB查询语言中的等效查询。您编写的LINQ查询无法转换为原始MongoDB查询,因为此部分:

.Where(x=>ImageHash.Similarity(x.Hash, hash) >= 50)

在MongoDB查询语言中没有等效项。

您需要做的是获取客户端的所有Image _id和Hash值并运行您的Similarity条件客户端。一旦你拥有足够相似的所有图像的_id值,你就可以自己获取图像。

希望您的查询还包含其他条件,以便只需要通过相似性标准客户端运行图像的子集。

看起来或多或少会像这样:

var matchingIds = collection.FindAllAs<BsonDocument>
    .SetFields("_id", "Hash")
    .AsEnumerable() // force client side evaluation of the rest of the query
    .Where(x => ImageHash.Similarity(x["Hash"].AsByteArray, hash) > 50))
    .Select(x => x["_id"]);
var query = Query.In("_id", matchingIds);
var matchingImages = collection.Find(query);
foreach (var image in matchingImages)
{
    // process matching image
}

答案 1 :(得分:0)

正如您在评论中所说,您是否尝试过POCO课程?

public class MyImage
{
 [BsonId]
 public ObjectId id {get;set;}    
 public string Hash {get;set;}

}

var results = imageCollection
 .AsQueryable(MyImage)
.Where(x=>ImageHash.Similarity(x.Hash, hash) >= 50)
.ToList();