Вы можете искать ОГРАНИЧЕННЫЕ категории и по-прежнему находить результаты. ОГРАНИЧЕНО не означает, что вы не можете его искать. Это означает, что эти данные должны быть получены от поставщиков услуг высшего качества (например, от правительства или качества HERE).
Пример. В приведенном ниже запросе я могу выполнить поиск категории терминала аэропорта (ОГРАНИЧЕНО) и получить соответствующие результаты. Надеюсь, вы найдете это полезным.
https://places.cit.api.here.com/places/v1/discover/explore?at=50.038174%2C8.562152&cat=400-4000-4582&cs=pds&Accept-Language=en-US%2Cen%3Bq%3D0.5&app_id=xxxx&app_code=xxxx
Я склонен идти для этого шаблона:
public class DogWithBreed
{
public Dog Dog { get; set; }
public string BreedName { get; set; }
}
public IQueryable<DogWithBreed> GetDogsWithBreedNames()
{
var db = new DogDataContext(ConnectString);
var result = from d in db.Dogs
join b in db.Breeds on d.BreedId equals b.BreedId
select new DogWithBreed()
{
Dog = d,
BreedName = b.BreedName
};
return result;
}
Это означает, что у Вас есть дополнительный класс, но это быстро и легко кодировать, легко расширяемый, допускающий повторное использование и безопасный с точки зрения типов.
Если у Вас есть установка отношений в Вашей базе данных с внешней ключевой сдержанностью на BreedId разве, Вы уже не получаете это?
, Таким образом, я могу теперь звонить:
internal Album GetAlbum(int albumId)
{
return Albums.SingleOrDefault(a => a.AlbumID == albumId);
}
И в коде, который называет это:
var album = GetAlbum(1);
foreach (Photo photo in album.Photos)
{
[...]
}
Так в Вашем экземпляре Вы назвали бы что-то как собака. Порода. BreedName - как я сказал, это полагается на Вашу базу данных, настраиваемую с этими отношениями.
, Поскольку другие упомянули, DataLoadOptions поможет уменьшить вызовы базы данных, если это будет проблемой.
Ну, при возврате Собак Вы сделали бы:
public IQueryable<Dog> GetDogsWithBreedNames()
{
var db = new DogDataContext(ConnectString);
return from d in db.Dogs
join b in db.Breeds on d.BreedId equals b.BreedId
select d;
}
, Если Вы хотите нетерпеливо загруженную Породу и не лениво загруженные, просто используйте соответствующее конструкция DataLoadOptions.
Нет Вы не можете возвратить анонимные типы, не проходя некоторый обман.
, Если бы Вы не использовали C#, что Вы искали бы (возвращающий несколько данных без конкретного типа) назван Кортежем.
существует много реализаций кортежа C#, с помощью одной показанный здесь , код работал бы как это.
public IEnumerable<Tuple<Dog,Breed>> GetDogsWithBreedNames()
{
var db = new DogDataContext(ConnectString);
var result = from d in db.Dogs
join b in db.Breeds on d.BreedId equals b.BreedId
select new Tuple<Dog,Breed>(d, b);
return result;
}
И на сайте вызова:
void main() {
IEnumerable<Tuple<Dog,Breed>> dogs = GetDogsWithBreedNames();
foreach(Tuple<Dog,Breed> tdog in dogs)
{
Console.WriteLine("Dog {0} {1}", tdog.param1.Name, tdog.param2.BreedName);
}
}
Вы можете возвращать анонимные типы, , но это действительно не симпатично .
В этом случае я думаю, что было бы намного лучше создать соответствующий тип. Если это только будет используемым из типа, содержащего метод, сделайте это вложенным типом.
Лично я хотел бы, чтобы C# стал "названным анонимными типами" - т.е. то же поведение как анонимные типы, но с именами и объявлениями свойства, но вот именно.
РЕДАКТИРОВАНИЕ: Другие предлагают возвратить собак и затем получить доступ к имени породы через путь свойства и т.д. Это - совершенно разумный подход, но IME, который он приводит к ситуациям, где Вы сделали запрос конкретным способом из-за данных, Вы хотите использовать - и та метаинформация потеряна, когда Вы просто возвращаетесь IEnumerable<Dog>
- запрос может быть ожидание , Вы для использования (говорите) Breed
, а не Owner
из-за некоторых опций загрузки и т.д., но если Вы забываете, что и начинают использовать другие свойства, Ваше приложение может работать, но не так эффективно, как Вы первоначально предусмотрели. Конечно, я мог говорить мусор или сверхоптимизация, и т.д.
Просто выберите собак, затем используйте dog.Breed.BreedName
, это должно хорошо работать.
, Если у Вас есть много собак, используйте DataLoadOptions. LoadWith для сокращения количества вызовов дб.