2011-09-16 23 views
3

次のクエリをlinqに変換しようとしています。内部結合、複数グループ別、最小値付き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>(); 

私の問題は、会議のプロパティでスタートプロパティへのアクセスを取得することです。

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

ご協力いただけると幸いです、 ジョン。

答えて

3

まず、LINQを修正しましょう。 LINQ to Entitiesでjoinを使用するのはnearly always wrongです。

また、クライアントごとにMINMAXの集約を容易にするために、SQL GROUP BYを使用しているようです。 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はこれをサポートしています。

の番号を増やしたい場合は、この方法だけをとし、indexed overload to Enumerable.Selectとします。

関連する問題