MongoDB Linq查询,包括作为参数的对象列表



我正试图通过传递对象列表作为参数来创建MongoDB LINQ查询。我正在传递给方法IEnumerable集合:

IEnumerable<(double latitude, double longitude)> coords

我正在构建以下查询:

var q =
GetDbCollection()
.AsQueryable()
.Where(x => coords.Any(c => x.Longitude == c.longitude && x.Latitude == c.latitude))
.OrderByDescending(x => x.Date)
.Take(coords.Count());

GetDbCollection()具有以下实现:

internal IMongoCollection<T> GetDbCollection(string name = "")  
{
if (string.IsNullOrWhiteSpace(name)) name = typeof(T).Name;
var client = new MongoClient(_dbContext.ConnectionString);      
var database = client.GetDatabase(_dbContext.DatabaseName);
var collection = database.GetCollection<T>(name);
return collection;
}

查询的这一部分不起作用:

Where(x => coords.Any(c => x.Longitude == c.longitude && x.Latitude == c.latitude))

我得到以下异常:

不支持的筛选器:Any(value(System.Linq.Enumerable+SelectListIterator2[Models.Coordinate,System.ValueTuple2[System.Double,System.Double]]。

正如这个答案所说:micki的答案,你可以使用AnyIn来执行这个任务

看起来这个实现解决了问题

List<FilterDefinition<Models.Forecast>> filters = new List<FilterDefinition<Models.Forecast>>();
foreach (var item in coords)
{
var filterBuilder = Builders<Models.Forecast>.Filter.Where(x => x.Latitude == item.latitude && x.Longitude == item.longitude);
filters.Add(filterBuilder);
}
var filterDefinition = Builders<Models.Forecast>.Filter.Or(filters);
var q = GetDbCollection()
.Find(filterDefinition)
.SortByDescending(x => x.Date)
.Limit(coords.Count());

最新更新