具有内连接的Linq查询,多个group by和min max

时间:2011-09-16 12:09:49

标签: c# sql linq-to-entities group-by min

我正在尝试将以下查询转换为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 个答案:

答案 0 :(得分:3)

首先,让我们修复LINQ。在LINQ to Entities中使用joinnearly always wrong

此外,您似乎仅使用SQL GROUP BY来促进每个客户端使用聚合MINMAX。 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支持。

如果您想要此方法的递增数字,请使用indexed overload to Enumerable.Select