2017-10-04 10 views
-1

C#Razor MVCプロジェクトのMySQLデータベースに対して、次のLINQクエリがあります。TruncateTime()を使用しないでLINQでグルーピングする

private Dictionary<DateTime?, int> getOrderQuantityDict(DateTime start, DateTime end, int siteCode) 
{ 
    return (from o in thisDataEntities.this_table 
     where o.created_at >= start 
     && o.created_at <= end 
     && o.store_id == siteCode 
     select new { OrderDate = o.created_at, Id = o.entity_id}) 
     .GroupBy(q => q.OrderDate) 
     .ToDictionary(q => q.Key, q => q.Count()); 
} 

1日ごとにグループ化する必要があります。今すぐq.OrderDateには時、分、秒があります。私はグループ化するときそれらを無視する必要があります。

トリッキーな部分:私はTruncateTime()なしでこれを行う必要があります。ホストがDBを移動したときに何らかの理由でTruncateTime()を使用できなくなりました。私たちのホストは、この問題に関してはあまり役に立っていませんでしたが、私は回避策が可能であると考えています。

+0

'.GroupBy(q => q.OrderDate.Date)' –

+1

@JeroenvanLangen - エンティティにLinqがプロパティ '.Date'をSQLに変換できないことを恐れています – Fabio

答えて

1

はそれをテストしていませんが、次はあなたを助けるかもしれない:

return (from o in thisDataEntities.this_table 
    where o.created_at >= start 
    && o.created_at <= end 
    && o.store_id == siteCode 
    select new { OrderDate = o.created_at, Id = o.entity_id}) 
    .AsEnumerable() //Once this is executed, the database will return the result of the query and any other statement after this will be ran locally so TruncateTime will not be an issue 
    .GroupBy(q => q.OrderDate) 
    .ToDictionary(q => q.Key, q => q.Count()); 
+0

マイナーな詳細がいくつかあります間違っていましたが、 '.AsEnumerable()'を使ってC#ロジックを実行できるようにするというアイディアは絶対に重要でした。私が使用したものと一致する編集を提案します。本当にありがとう! – Goose

0

あなたは日付を文字列に変換し、日付の文字列表現に基づいてグループ化することができます。

return 
    thisDataEntities.this_table 
        .Where(o => o.created_at >= start) 
        .Where(o => o.created_at <= end) 
        .Where(o => o.store_id == siteCode) 
        .Select(o => new 
          { 
           OrderDate = o.created_at, 
           Id = o.entity_id, 
           OrderDateFormatted = 
            SqlFunctions.DateName("yyyy", o.created_at) + "-" + 
            SqlFunctions.DateName("mm", o.created_at) + "-" + 
            SqlFunctions.DateName("dd", o.created_at) 
          }) 
        .GroupBy(n => n.OrderDateFormatted) // format "2017-10-03" 
        .ToDictionary(g => g.First().OrderDate, g => g.Count()); 

上記のアプローチをデータベース側で実行する必要があります。もちろんGroupByがサポートされている場合のみです。

関連する問題