Возвратить анонимные результаты типа?

Вы можете искать ОГРАНИЧЕННЫЕ категории и по-прежнему находить результаты. ОГРАНИЧЕНО не означает, что вы не можете его искать. Это означает, что эти данные должны быть получены от поставщиков услуг высшего качества (например, от правительства или качества 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
187
задан shA.t 17 May 2015 в 21:15
поделиться

6 ответов

Я склонен идти для этого шаблона:

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;
}

Это означает, что у Вас есть дополнительный класс, но это быстро и легко кодировать, легко расширяемый, допускающий повторное использование и безопасный с точки зрения типов.

203
ответ дан teedyay 23 November 2019 в 05:46
поделиться

Если у Вас есть установка отношений в Вашей базе данных с внешней ключевой сдержанностью на BreedId разве, Вы уже не получаете это?

DBML relationship mapping

, Таким образом, я могу теперь звонить:

internal Album GetAlbum(int albumId)
{
    return Albums.SingleOrDefault(a => a.AlbumID == albumId);
}

И в коде, который называет это:

var album = GetAlbum(1);

foreach (Photo photo in album.Photos)
{
    [...]
}

Так в Вашем экземпляре Вы назвали бы что-то как собака. Порода. BreedName - как я сказал, это полагается на Вашу базу данных, настраиваемую с этими отношениями.

, Поскольку другие упомянули, DataLoadOptions поможет уменьшить вызовы базы данных, если это будет проблемой.

0
ответ дан Zhaph - Ben Duguid 23 November 2019 в 05:46
поделиться

Ну, при возврате Собак Вы сделали бы:

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.

0
ответ дан Dave Markle 23 November 2019 в 05:46
поделиться

Нет Вы не можете возвратить анонимные типы, не проходя некоторый обман.

, Если бы Вы не использовали 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);
    }
}
8
ответ дан joshperry 23 November 2019 в 05:46
поделиться

Вы можете возвращать анонимные типы, , но это действительно не симпатично .

В этом случае я думаю, что было бы намного лучше создать соответствующий тип. Если это только будет используемым из типа, содержащего метод, сделайте это вложенным типом.

Лично я хотел бы, чтобы C# стал "названным анонимными типами" - т.е. то же поведение как анонимные типы, но с именами и объявлениями свойства, но вот именно.

РЕДАКТИРОВАНИЕ: Другие предлагают возвратить собак и затем получить доступ к имени породы через путь свойства и т.д. Это - совершенно разумный подход, но IME, который он приводит к ситуациям, где Вы сделали запрос конкретным способом из-за данных, Вы хотите использовать - и та метаинформация потеряна, когда Вы просто возвращаетесь IEnumerable<Dog> - запрос может быть ожидание , Вы для использования (говорите) Breed, а не Owner из-за некоторых опций загрузки и т.д., но если Вы забываете, что и начинают использовать другие свойства, Ваше приложение может работать, но не так эффективно, как Вы первоначально предусмотрели. Конечно, я мог говорить мусор или сверхоптимизация, и т.д.

68
ответ дан Jon Skeet 23 November 2019 в 05:46
поделиться

Просто выберите собак, затем используйте dog.Breed.BreedName, это должно хорошо работать.

, Если у Вас есть много собак, используйте DataLoadOptions. LoadWith для сокращения количества вызовов дб.

3
ответ дан Andrey Shchekin 23 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: