我正试图通过传递对象列表作为参数来创建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+SelectListIterator
2[Models.Coordinate,System.ValueTuple
2[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());