LINQ to sql возвращает группу по результатам метода - PullRequest
1 голос
/ 25 марта 2010

Как создать метод для возврата результатов группы в LINQ в sql, например, приведенный ниже:

internal SomeTypeIDontKnow GetDivisionsList(string year)
{
    var divisions =  from p in db.cm_SDPs
                          where p.acad_period == year
                          group p by new
                          {
                              p.Division
                          } into g
                          select new
                          {
                              g.Key.Division
                          };
    return divisions;
}

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

Результаты будут использоваться только для заполнения поля со списком.

Ответы [ 3 ]

4 голосов
/ 25 марта 2010

Вы не можете * вернуть анонимный тип.

Либо вам нужно выяснить, какой тип возвращает ваш запрос, и возвращать именно его, либо вы можете переименовать метод BindDivisionsList (...) и выполнить привязку данных внутри метода.

Я бы порекомендовал первое (делая некоторые предположения о ваших типах здесь): -

internal IEnumerable<Division> GetDivisionsList(string year)
{
    IEnumerable<Division> divisions =
        from p in db.cm_SDPs
        where p.acad_period == year
        group p by new
        {
            p.Division
        } into g
        select g.Key.Division;

    return divisions;
}

или поочередно (и я бы обычно так делал): -

internal IEnumerable<Division> GetDivisionsList(string year)
{
    IEnumerable<Division> divisions =
        db.cm_SPDs.Where(x => x.acad_period == year)
                  .Select(x => x.Division)
                  .Distinct();

    return divisions;
}

Редактировать: * Вы можете , только не с пользой - вам придется вернуть «объект». Смотрите: -

http://msdn.microsoft.com/en-us/library/bb397696.aspx

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

1 голос
/ 25 марта 2010

Вы на самом деле не возвращаете результат 'group by' - вы просто возвращаете обычную коллекцию LINQ (в данном случае IEnumerable<Division>). Как указывает Иэн, вы можете достичь того же результата, используя оператор .Distinct, а не группируя и затем выбирая из этих групп.

Если вы хотите вернуть фактические результаты группы, вы можете преобразовать набор результатов в Dictionary<Key, List<Element>> - он не сможет вернуться к исходному типу, но интерфейс IGrouping выглядит как возможно изоморфна этой структуре.

Другими словами, когда мне нужно изобразить структуру IGrouping, я представляю словарь, в котором каждая пара ключ / значение является группой, с

  • каждый ключ представляет отдельные значения в предложении Group By
  • каждое значение, представляющее элементы из исходной коллекции, которые соответствуют условию Group By, т.е. члены группы.
0 голосов
/ 25 марта 2010

LINQ "ленивый". Вам нужно сделать ToList() (или любой из других подходящих методов) и получить IEnumerable<T>. Прочтите о Ленивой Загрузка.

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