Linq-to-sql группы запросов, по-прежнему выбирая детали - PullRequest
1 голос
/ 21 декабря 2011

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

Животные
Тип удостоверения личности
1 Львы
2 Тигры
3 Медведя

AnimalDetails
IDAnimalId Рост Вес
1 1 62 дюйма 200 фунтов
2 1 56 дюймов 150 фунтов
3 1 23 дюйма 125 фунтов
4 2 47 дюймов 500 фунтов
5 2 88 дюймов 150 фунтов
6 2 15 дюймов125 фунтов

Если это поможет, сделайте вид, что эти таблицы уже объединены

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

Я хочу сгруппировать по типу животных (лев и т. д.) и выбрать его, а также выбрать детали для льва.

Поэтому я хочу, чтобы Ключбыть львом, может быть, это сборник информации о льве.

Имеет ли это смысл?

Моя попытка, очевидно, не сработает, но в любом случае это так:

var animals = (from a in Animals   
               group a by new { AnimalType = a.Type }
               into grouped
               select grouped);

ОБНОВЛЕНИЕ Добавлена ​​структура таблицы псевдо.Я не ищу 1 ответ на этот вопрос, поскольку это, очевидно, поддельные данные, просто ищу направление для достижения этой цели.

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

Я бы прочитал эту статью SO: Linq с левым соединением в подзапросе, содержащем Count

Сделайте свою обычную группу по Animals, а затем присоединитесь к AnimalId к таблице сведений, чтобы получитьподробные атрибуты только один раз.

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

        var query = (from d in details
                     join a in
                        (from animal in animals
                         group animal by animal.Name into g
                         select new { Name = g.Key }) on d.Name equals a.Name
                     select new { a.Name, d.Height, d.Weight }).ToList();

В приведенном выше запросе предполагается, что таблицы псевдоданных у вас не объединены.Если они уже объединены, то я не понимаю, почему вы хотите сгруппировать по имени животного, а затем получить информацию, так как детали в вашем примере встречаются более одного раза для каждого животного.(1 лев имеет несколько записей).

0 голосов
/ 21 декабря 2011

вы теряете значение идентификатора в Animals используя group byесли теряется значение id, вы не можете использовать foreinKey между Animals и AnimalsDetail.Таким образом, вы не используете group by С помощью этого кода вы можете получить animalDetails.

    var listAnimals = new List<Animals>
                       {
                           new Animals {Id = 1, Name = "Lions"},
                           new Animals {Id = 2, Name = "Tigers"},
                           new Animals {Id = 3, Name = "Bears"}
                       };

    var listAnimalDetails = new List<AnimalDetails>
                                {
                                    new AnimalDetails {Id = 1, AnimalId = 1, Height = 62, Weight = 200},
                                    new AnimalDetails {Id = 2, AnimalId = 1, Height = 56, Weight = 150},
                                    new AnimalDetails {Id = 3, AnimalId = 1, Height = 23, Weight = 125},
                                    new AnimalDetails {Id = 4, AnimalId = 2, Height = 47, Weight = 500},
                                    new AnimalDetails {Id = 5, AnimalId = 2, Height = 88, Weight = 150},
                                    new AnimalDetails {Id = 6, AnimalId = 2, Height = 15, Weight = 125}
                                };


    var join = (from anm in listAnimals
                   join anmD in listAnimalDetails
                   on anm.Id equals anmD.AnimalId
                   select new
                   {
                       Animal = anm.Name,
                       H = anmD.Height,
                       W = anmD.Weight
                   }).ToList();

, после чего вы можете использовать group by при объединении.Я надеюсь, что вы поможете.

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