我正在升级我的应用程序,以使用我所使用的1.9.2版的最新版本的Mongo C#驱动程序。
这是我使用1.9.2驱动程序的旧代码:
public IQueryable<Address> SearchByDistance(double latitude, double longitude, double rangeInKm)
{
var rangeInMeters = rangeInKm * 1000;
var point = GeoJson.Point(GeoJson.Geographic(longitude, latitude)); //long, lat
var clause = Query<Address>.Near(y => y.GeoPoint, point, rangeInMeters);
var query = collection.AsQueryable().Where(x => clause.Inject());
return query;
}
上面是在我的DAL层-在我的服务层,然后我在返回的数据的配置中定义一个特定的数字,并对其进行ToList()并使用以下代码将其返回到UI:
results.Take(SearchResultLimit).ToList();
使用最新的驱动程序,我必须将DAL层的代码更新为以下代码:
public IQueryable<Address> SearchByDistance(double latitude, double longitude, double rangeInKm)
{
var rangeInMeters = rangeInKm * 1000;
var point = GeoJson.Point(GeoJson.Geographic(longitude, latitude)); //long, lat
var filter = Builders<Address>.Filter.Near(y => y.GeoPoint, point, rangeInMeters);
return collection.Find(filter).ToList().AsQueryable();
}
上面的方法有效,但是我不喜欢加载整个集合以返回AsQueryable的方法-我知道我可以在DAL层更改方法签名并将Take移到DAL层,但是我想尽可能减少侵入性的代码。
我想知道是否有更好的方法在应用相同的过滤器定义时在DAL层返回IQueryable。
我尝试过:
return collection.AsQueryable().Where(filter);
但是对于Where子句使用此过滤器定义是不正确的。