2010-08-06 19 views
5

Düzenli SQL'deLinq to SQL (Grup numarası) tarafından Yılya göre grup

SELECT * From T GROUP BY DATEPART(wk, T.Date) 

gibi bir şey yapabilirim Bunu Linq'den SQL'e nasıl yapabilirim?

Aşağıdakiler çalışmıyor

From F In DB.T Group R By DatePart(DateInterval.WeekOfYear, F.Date) 

Ayrıca çalışmıyor:

From F In DB.T Group R By (F.Date.DayOfYear/7) 
+0

gibi SQL? Derleme yapmıyor, beklenen sonuçlara dönmüyor mu? – sgriffinusa

+0

derlemez .. "Aralık değişken adı yalnızca argüman içermeyen basit veya nitelikli bir addan çıkarılabilir." – ariel

+0

tamam, yanıt "From F In DB.T Grup R By WeekOfYear = (F.Date.DayOfYear/7)" – ariel

cevap

0

Bu doğru çalışır. Grubu yanlış olarak belirttiniz. Bu kodun sonucu, nesnelerin bir koleksiyonudur. Her nesne Bu durumda (tarafından F.Date.DayOfYear/7 sonucunu gruplandırılacaktır ne Key özelliği olacaktır. Her nesne grubu şartı yerine T nesneler topluluğudur olacak.

+0

tek yapmam gereken "DB.T Group R By WeekOfYear = F Date.DayOfYear/7) ";) – ariel

0

Eğer Eğer bu hesaba katmalı olacak aşağıdaki kodda olduğu kültürün endişe.

var ci = CultureInfo.CurrentCulture; 
var cal = ci.Calendar; 
var rule = ci.DateTimeFormat.CalendarWeekRule; 
var firstDayOfWeek = ci.DateTimeFormat.FirstDayOfWeek; 

var groups = from F in DB.T 
      group F by cal.GetWeekOfYear(F, rule, firstDayOfWeek) into R 
      select R; 
+0

bu işe yaramıyor - "Yöntem" Int32 GetWeekOfYear (System.DateTime, System.Globalization.CalendarWeekRule, System.DayOfWeek) 'SQL'e desteklenen bir çevirisi yoktur. " – ariel

+0

Görünen o ki, Calendar.GetWeekOfYear Linq2Sql veya Linq to Entities; İlk önce tüm verileri ortaya çıkarırsanız o zaman cal.GetWeekOfYear (x, rule, firstDayOfWeek) kullanın. –

+0

evet ..ancak DayOfYear'ı 7'ye bölerek ihtiyaçlarımız için yeterli. Teşekkürler! – ariel

7

LINQ to SQLCalendar.WeekOfYear yöntemi desteklemiyor, ancak potansiyel TSQL function that wraps the call to DatePart yaratabilecek çoğu için dayofyear/7 numara çalışmalıdır durumlarda ve m uch kullanımı daha kolay. Böyle bir şeye

var x = from F in DB.T 
     group F by new {Year = F.Date.Year, Week = Math.Floor((decimal)F.Date.DayOfYear/7)} into FGroup 
     orderby FGroup.Key.Year, FGroup.Key.Week 
     select new { 
      Year = FGroup.Key.Year, 
      Week = FGroup.Key.Week, 
      Count = FGroup.Count() 
     }; 

Sonuçlar::

Year Week Count 
2004 46  3 
2004 47  3 
2004 48  3 
2004 49  3 
2004 50  2 
2005 0  1 
2005 1  8 
2005 2  3 
2005 3  1 
2005 12  2 
2005 13  2 
+2

Sadece yılın bir Pazar günü başlayacağını varsayarsak, bunun doğrudan Takvim haftalarına denk gelmeyeceğini unutmayın. Tam olarak eşleştirmek için, Calendar.WeekOfYear'ı kullanmanız veya DatePart çağrısını bir SQL İşlevine sarmanız gerekir. –

0

Önce haftadır ilk günün tarihini almalısınız Burada ile sona erdi kod.

Haftanın ilk gününü almak için. bu kodu kullanabilirsiniz:

public static class DateTimeExtensions 
{ 
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek) 
    { 
     int diff = dt.DayOfWeek - startOfWeek; 
     if (diff < 0) 
     { 
      diff += 7; 
     } 
     return dt.AddDays(-1 * diff).Date; 
    } 
} 

Sonra yapabilirsiniz haftanın ilk tarihe göre grup.

Yani normal SQL bu kodu: ne demek istiyorsun, çalışmıyor derken Linq

SELECT * From T GROUP BY DATEPART(wk, T.Date) 

yapılabilir bu

T.GroupBy(i => i.Date.StartOfWeek(DayOfWeek.Monday));