Хорошо, ребята, я новичок в Data Services и LINQ, отчаянно нуждающихся в некотором руководстве. Всего за несколько дней я столкнулся с множеством неожиданных препятствий, и теперь я застрял на них. Я надеюсь, что это просто типичные разочарования от изучения нового инструмента.
У меня есть служба данных WCF для обслуживания данных из таблицы базы данных Sql Server с координатами Gps. В частности, у меня есть метод операции обслуживания, который позволяет вам указывать десятичную точность и диапазон широты / долготы для более общего представления данных.
В веб-браузере он работает так, как ожидалось. Однако, когда я пытаюсь вызвать операцию из моего клиентского приложения, список, возвращаемый клиенту, отличается от списка, сгенерированного службой.
Я буду использовать кусочки своего кода, чтобы объяснить детали:
Операция обслуживания данных:
// This is my service operation that I need to call from my client app (see below).
// It should return an IEnumerable<Gps> (Gps is one of my Entity Model
// types) list of distinct GPS rounded to the number of decimal positions
// specified and within the range specified.
[WebGet]
public IEnumerable<Gps> GetGpsView(int decimalPlaces, decimal minLatitude, decimal minLongitude, decimal maxLatitude, decimal maxLongitude)
{
// I must first return a list of anonymous-type objects
// because LINQ does not seem to allow me to construct my
// Gps object within the query (one of those other issues
// I had to tip-toe around).
var list = (from g in this.CurrentDataSource.Gps
where g.Latitude >= minLatitude &&
g.Latitude <= maxLatitude &&
g.Longitude >= minLongitude &&
g.Longitude <= maxLongitude
select new
{
Id = 0,
Latitude = Math.Round(g.Latitude, decimalPlaces),
Longitude = Math.Round(g.Longitude, decimalPlaces)
}).Distinct().ToList();
// Now that I have my results, I need to convert the items in the
// list to my Gps entity object.
IEnumerable<Gps> gpsList = list.ConvertAll<Gps>(item => new Gps
{
Id = item.Id,
Latitude = item.Latitude,
Longitude = item.Longitude
});
return gpsList;
}
Если я отлаживаю вышеуказанный метод (запускаю его на виртуальном сервере Visual Studio) при вызове из моего клиентского приложения, gpsList, похоже, содержит правильные данные непосредственно перед возвратом к клиенту. Используя мои тестовые параметры, я получаю список из 200 различных объектов Gps, значения которых округляются до указанных десятичных разрядов.
Однако, как только результаты возвращаются вызывающему методу в моем клиентском приложении, у меня есть список 200-гигабитных объектов, но все они одинаковые. Чтобы быть точным, дублированное значение является последним значением в моем ожидаемом наборе результатов. Я подтвердил это, вызвав эту операцию в веб-браузере и просмотрев результаты.
Метод клиента:
// Partial class extension of code auto-generated by service reference.
public partial class HsiSideBySideEntities
{
public List<Gps> GetGpsView(int decimalPlaces, decimal minLatitude, decimal minLongitude, decimal maxLatitude, decimal maxLongitude)
{
this.IgnoreMissingProperties = true;
// Format my relative URI string.
string uri = string.Format("/GetGpsView?decimalPlaces={0}&minLatitude={1}M&minLongitude={2}M&maxLatitude={3}M&maxLongitude={4}M", decimalPlaces, minLatitude, minLongitude, maxLatitude, maxLongitude);
// If I debug both client and service at the same time, when I step over this
// line, it does reach my data service - and as I mentioned above, on the
// service end it appears to generate the correct results.
List<Gps> gpsList = this.Execute<Gps>(new Uri(uri, UriKind.Relative)).ToList();
// However, the results are returned to the client code, my list contains
// duplicates of the last expected record.
return gpsList;
}
}
Я попытался удалить часть «ToList ()» строки «Execute ()», но когда я пытаюсь просмотреть набор результатов в отладчике, он показывает исключение, которое гласит: «Только одно перечисление поддерживается это IEnumerable. "
Насколько я могу судить, мой код клиента является первым подозреваемым. В конце концов, любой другой тест показывает, что моя операция службы данных дает желаемые результаты.
Нужно ли делать что-то другое, чтобы получить список объектов IEnumerable из службы данных?
Я понимаю, что существует опция CreateQuery (), но я прочитал, что Execute () является более подходящим маршрутом для этого сценария.