Я получаю коллекцию предметов, используя сервис. Я хочу вычислить расстояние от географической координаты для каждого элемента в результатах, но я не знаю, как добавить это к существующему запросу службы с помощью лямбды.
Вот как я получаю данные:
IEnumerable<Listing> items = await _listingService.Query(x => x.CategoryID
== model.CategoryID || keys.Any(c => c == x.CategoryID))
.Include(x => x.ListingPictures)
.Include(x => x.Category)
.SelectAsync();
Вот как я могу получить расстояние, используя LINQ
, но это использует коллекцию items
после выполнения вышеприведенного оператора:
double lat = 41.2;
double lon = -71.01;
DbGeography point = DbGeography.FromText(String.Format(CultureInfo.InvariantCulture, "POINT({0} {1})", lon, lat));
List<Listing> items1 = new List<Listing>(from g in items
let distance = g.Geolocation.Distance(point)
orderby distance
select new Listing()
{
ID = g.ID,
CategoryID = g.CategoryID,
Title = g.Title,
Description = g.Description,
Price = g.Price,
Location = g.Location,
Created = g.Created,
DistanceInMiles = (distance / 1609.344),
});
items = items1;
Это не работает, потому что теряет все отношения из операторов Include()
в первом запросе. Я не могу понять, как сделать то же самое, используя ключевое слово let
в первом лямбда-запросе службы. Я пытаюсь не запрашивать дважды. Есть ли способ вычислить поле в первом лямбда-запросе службы, чтобы я мог добавить расстояние к каждому элементу?
Я думал, что использование проекций может сработать, но я не смог этого сделать.