Как мне вернуть IEnumerable? - PullRequest
       4

Как мне вернуть IEnumerable?

0 голосов
/ 03 апреля 2011

Я пытаюсь вернуть IEnumerable. Вот мой код:

public static IEnumerable<int> GetAnswersIDs(int id)
{
    using (var context = new MvcApplication4.Entity.test2Entities1())
    {
        return (from p in context.post
                  where p.post_parentid == id && p.post_isdeleted == false
                  select new
                  {
                      p.post_id
                  }).ToList();
    }           
}

Можно ли вернуть объект IEnumerable?

Ответы [ 5 ]

3 голосов
/ 03 апреля 2011

Вам не нужно использовать какой-либо метод To [Anything] или что-то подобное. Ваша ошибка - ваш выбор. Правильный код такой:

public static IEnumerable<int> GetAnswersIDs(int id)
{
    using (var context = new MvcApplication4.Entity.test2Entities1())
    {
        return (from p in context.post
                  where p.post_parentid == id && p.post_isdeleted == false
                  select p.post_id);
    }           
}

Как вы видите, вы создали анонимный класс, который вам не нужен, потому что вы хотите просто значение int.

- РЕДАКТИРОВАТЬ -

Вы столкнетесь с исключением ObjectDisposed. Поскольку при использовании возвращенного объекта IEnumerable необходимо использовать контекст, расположенный в методе GetAnswersIDs.

Таким образом, вы можете возвратить List вместо IEnumerable или вам следует определить контекст из вашего метода GetAnswersIDs.

Это код со списком

public static List<int> GetAnswersIDs(int id)
{
    using (var context = new MvcApplication4.Entity.test2Entities1())
    {
        return (from p in context.post
                  where p.post_parentid == id && p.post_isdeleted == false
                  select p.post_id).ToList();
    }           
}
2 голосов
/ 03 апреля 2011

Я думаю, вам следует использовать ToArray или ToList (оба Array<T> и List<T> внедряют IEnumerable<T>), поскольку, когда вы вернетесь, контекст удаляется, я почти уверен, что вы получите исключение, если вы используете AsEnumerable, оставляя само перечисление для последующих шагов:

public static IEnumerable<int> GetAnswersIDs(int id)
{
    using (var context = new MvcApplication4.Entity.test2Entities1())
    {
        return (from p in context.post
                  where p.post_parentid == id && p.post_isdeleted == false
                  select p.post_id).ToArray();
    }           
}

Кстати, я думаю, что в вашем случае использование linq более многословно, чем не-linq версия:

public static IEnumerable<int> GetAnswersIDs(int id)
{
    using (var context = new MvcApplication4.Entity.test2Entities1())
    {
        return context.post.
          Where(p => p.post_parentid == id && !p.post_isdeleted).
          Select(p => p.post_id).
          ToArray();
    }           
}

В качестве примечания вы можете рассмотреть возможность переформатирования имен полей в вашей модели, чтобы соответствовать соглашениям об именах в .NET .

1 голос
/ 03 апреля 2011

Я думаю, что вы ищете AsEnumerable():

Однако, взглянув на ваш код, вы должны полностью материализовать результаты запроса, поэтому целесообразно использовать ToList() - в противном случае вы получите исключение, когда позже попытаетесь перечислить результаты, поскольку он попытается получить доступ к БД. в удаленном контексте БД.

0 голосов
/ 03 апреля 2011

Для базового IEnumerable возврата, доходность возврата используется

0 голосов
/ 03 апреля 2011

Я не думаю, что вам нужно select new {}
select p.post_id должно быть достаточно!Тогда вы можете окружить его .AsEnumerable()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...