Linq-запрос с внутренним объединением, несколькими группами по и минимальным максимумом - PullRequest
3 голосов
/ 16 сентября 2011

Я пытаюсь преобразовать следующий запрос в linq.

SELECT        Client.Nom, Client.Prenom AS Prénom, Client.Structure, MIN(Meeting.Start) AS Début, MAX(Meeting.Start) AS Fin, Meeting.Dispositifs AS Dispositif
FROM            Meeting INNER JOIN
                         Client ON Meeting.CliID = Client.CliID
WHERE        (Client.Nom LIKE 'kess%')
GROUP BY Client.Nom, Client.Prenom, Client.Structure, Meeting.Dispositifs
ORDER BY Début DESC, Fin

Пока у меня есть следующее:

var clients = this.ObjectContext.Clients;
            var meetings = this.ObjectContext.Meetings;

            //int i = 0;

            var query = from personne in clients
                        join meeting in meetings on personne.CliID equals meeting.CliID
                        where personne.CliID == guid
                        group personne by new { personne.Nom, personne.Prenom, personne.Structure, meeting.Dispositifs } into g
                        select new Parcour
                        {
                            //ID = i++,
                            Nom = g.Key.Nom,
                            Prénom = g.Key.Prenom,
                            Structure = g.Key.Structure,
                            Début = g.Min(m => m.Start),
                            Fin = g.Max(m => m.Start),
                            Dispositif = g.Key.Dispositifs,
                        };

            return query.ToList<Parcour>();

Моя проблема - получить доступ к Startсвойство, которое является свойством собрания.

Кроме того, есть ли способ иметь здесь ключ, такой как ID, который будет содержать int, который автоматически автоинкремментируется?

Любая помощь будет высоко ценится, Джон.

1 Ответ

3 голосов
/ 19 сентября 2011

Во-первых, давайте исправим LINQ. почти всегда неправильно использовать join в LINQ to Entities.

Кроме того, вы, похоже, используете SQL GROUP BY исключительно для облегчения использования совокупного MIN и MAX для каждого клиента. LINQ to Entities этого не требует. Таким образом, мы можем упростить это тоже.

Это оставляет нас с.

        var query = from personne in clients
                    where personne.CliID == guid
                        && personne.Meetings.Any() // simulate `INNER JOIN` 
                                                   // retirer les gens sans réunions
                                                   // pardonne mon français terrible, STP
                    select new Parcour
                    {
                        //ID = i++,
                        Nom = personne.Nom,
                        Prénom = personne.Prenom,
                        Structure = personne.Structure,
                        Début = personne.Meetings.Min(m => m.Start),
                        Fin = personne.Meetings.Max(m => m.Start),
                        Dispositif = personne.Dispositifs,
                    };

Тогда вы спросите:

Кроме того, есть ли здесь такой ключ, как ID, который будет содержать int, который автоматически автоинкремментируется?

Непонятно, что вы хотите здесь.

Если вам нужен ключ базы данных , используйте столбец AUTOINCREMENT. EF поддерживает это.

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

...