3

次のクエリを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プロパティにアクセスすることです。

また、自動インクリメントされるintを含むIDのようなキーをここに持つ方法はありますか?

ジョン、どんな助けでも大歓迎です。

4

1 に答える 1

3

まず、LINQ を修正しましょう。ほとんどの場合join、LINQ to Entities で使用するのは間違っています。

GROUP BYまた、集計MINMAXクライアントごとの使用を容易にするために SQL のみを使用しているようです。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,
                    };

次に、次のように尋ねます。

また、自動インクリメントされる int を含む ID のようなキーをここに持つ方法はありますか?

ここで何をしたいのか明確ではありません。

データベース キーが必要な場合は、AUTOINCREMENT 列を使用します。EFはそれをサポートします。

このメソッドだけに増加する数値が必要な場合は、インデックス付きのオーバーロードを Enumerable.Select に使用します。

于 2011-09-19T13:34:05.630 に答える