【问题标题】:Linq query with inner join, multiple group by and min max具有内部联接、多个分组依据和最小最大值的 Linq 查询
【发布时间】:2011-11-18 15:45:18
【问题描述】:

我正在尝试将以下查询转换为 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 属性,它是 meeting 的属性。

另外,有没有办法在这里有一个像 ID 这样的键,其中包含一个自动递增的 int?

任何帮助将不胜感激, 约翰。

【问题讨论】:

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


    【解决方案1】:

    首先,让我们修复 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

    【讨论】:

      猜你喜欢
      • 2012-03-24
      • 2016-12-21
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      相关资源
      最近更新 更多