2017-01-18 11 views
1

サービスへの接続数を毎日返すIqueryableメソッドを作成しようとしています。このデータはSQL Serverデータベースから読み込まれます。ここでグループごとのLinqコマンド - グループ化方法

はConnectionItemクラスは

public class ConnectionItem 
{ 
    public DateTime CreatedDate { get; set; } 
    public int NumberOfConnections { get; set; } 
} 

されており、ここで私はグループ化された日付値およびグループあたりのアイテム数にアクセスするにはどうすればよい私のIQueryable

private IQueryable<ConnectionItem> ListItems(DataContext dataContext) 
{ 
    return dataContext.Connections 
     .Join(dataContext.Configurations, 
      connections => connections.ConfigID, 
      config => config.ConfigID, 
      (connections, config) => new { cx = connections, cf = config }) 
     .Join(dataContext.Users, 
      config => config.cf.UserID, 
      users => users.UserID, 
      (config, users) => new { cf = config, su = users}) 
      .Where(q => q.su.AccountEventID == 123 && q.cf.cx.Successful == true) 
      .GroupBy(g => g.cf.cx.CreatedDate.ToShortDateString()) 
      .Select(s => new ConnectionItem 
      { 
       CreatedDate = ????, 
       NumberOfConnections = ???? 
      }); 
} 

のですか?

また、このような文を書くのは簡単ですか?私は、エイリアスcx、cfなどの動作について100%確信していません。

ご了承ください。

+0

「{CreateDate = s.Key、NumberOfConnections = s.Count()}」を呼び出すようにしてください。 –

答えて

2

グループ。 Dateプロパティは単に時間部分を削除します。日付を文字列に変換しているので、DateTimeオブジェクトの忠実性が失われています。

var eventId = 123; 
return dataContext.Connections.Join(dataContext.Configurations, 
     conn => conn.ConfigID, 
     cfg => cfg.ConfigID, 
     (conn, cfg) => new { conn, cfg }) 
    .Join(dataContext.Users, 
     x => x.cfg.UserID, 
     u => u.UserID, 
     (x, u) => new { x.conn, u }) 
    .Where(x => x.conn.Successful && x.u.AccountEventID == eventId) 
    .GroupBy(x => x.conn.CreatedDate.Date) 
    .Select(g => new ConnectionItem 
    { 
     CreatedDate = g.Key, 
     NumberOfConnections = g.Count(), 
    }); 

上記は、クエリ構文を使用してよりうまく表現できます。

var eventId = 123; 
return 
    from conn in dataContext.Connections 
    join cfg in dataContext.Configurations on conn.ConfigID equals cfg.ConfigID 
    join u in dataContext.Users on cfg.UserID equals u.UserID 
    where conn.Successful && u.AccountEventID == eventId 
    group 1 by conn.CreatedDate.Date into g 
    select new ConnectionItem 
    { 
     CreatedDate = g.Key, 
     NumberOfConnections = g.Count(), 
    }; 
0

.GroupBy linqメソッドは、IGrouping<TKey, TValue>を返します。これは、基本的にグループ化したKeyプロパティのリストです。 IEnumerable<IGrouping<TKey,TValue>>

だからここ

Select(s => new ConnectionItem 
     { 
      CreatedDate = ????, 
      NumberOfConnections = ???? 
     }); 

あなたの反復ので、私はあなたが数字ではない、実際のリスト

0
を探して実現したコメントごとにを編集し、この

Select(s => new ConnectionItem 
     { 
      CreatedDate = s.Key 
      NumberOfConnections = s.Count() 
     }); 

を行うことができます

s.Keys.Count()に電話すると、次のように表示されます。

private IQueryable<ConnectionItem> ListItems(DataContext dataContext) 
    { 
     return dataContext.Connections 
      .Join(dataContext.Configurations, 
       connections => connections.ConfigID, 
       config => config.ConfigID, 
       (connections, config) => new {cx = connections, cf = config}) 
      .Join(dataContext.Users, 
       config => config.cf.UserID, 
       users => users.UserID, 
       (config, users) => new {cf = config, su = users}) 
      .Where(q => q.su.AccountEventID == 123 && q.cf.cx.Successful == true) 
      .GroupBy(g => g.cf.cx.CreatedDate.ToShortDateString()) 
      .Select(s => new ConnectionItem 
      { 
       CreatedDate = s.Key, 
       NumberOfConnections = s.Count() 
      }); 
    } 

グループ句が グループのキー値と一致する0個以上の項目を含むIGrouping オブジェクトの配列を返します。たとえば、一連の文字列を にしたがって各文字列の最初の文字にグループ化することができます。この場合、最初の文字は で、キーはchar型で、各 IGroupingオブジェクトのKeyプロパティに格納されています。コンパイラは キーの型を推定します。 DateTimeオブジェクトのDate部により

Group clause docs

+0

なぜ投票が下りますか? –

関連する問題