2016-03-30 46 views
2

私は、次のLINQクエリと拡張メソッドのヘルプを探しています:LINQの拡張メソッド - GetYearWeekFormat拡張

DateTime? ddStartOfTime = Convert.ToDateTime("2016/04/10 11:15:00"); 
DateTime? ddEndOfTime = Convert.ToDateTime("2017/06/25 13:15:00"); 

List<int> doWeeksNeeded = new List<int>(); 

doWeeksNeeded.Add(201614); 
doWeeksNeeded.Add(201616); 

var dq1 = (from c in tblschedulefulldates 
     where doWeeksNeeded.Contains(c.ddJobStart.GetYearWeekFormat()) 
     orderby c.diEmployeeID 
     select new 
     { 
      diEmployeeID = c.diEmployeeID == null ? 0 : (int)c.diEmployeeID, 
      dnDayOfWeek = c.ddJobStart.DayOfWeek == null ? 0 : (int)c.ddJobStart.DayOfWeek 
     }); 

次は、拡張メソッドです:

public static int GetYearWeekFormat(this DateTime pddate) 
{ 
    int weekNo = GetIso8601WeekOfYear(pddate); 
    int year = pddate.Year; 
    if (weekNo == 1 && pddate.Month > 1) year = year + 1; 
    return Convert.ToInt32(year.ToString() + weekNo.ToString().Trim()); 
} 

public static int GetIso8601WeekOfYear(this DateTime pddate) 
{ 
    System.Globalization.Calendar cal = System.Globalization.CultureInfo.InvariantCulture.Calendar; 
    // Seriously cheat. If its Monday, Tuesday or Wednesday, then it'll 
    // be the same week# as whatever Thursday, Friday or Saturday are, 
    // and we always get those right 
    System.DayOfWeek day = cal.GetDayOfWeek(pddate); 
    if (day >= System.DayOfWeek.Monday && day <= System.DayOfWeek.Wednesday) 
    { 
     pddate = pddate.AddDays(3); 
    } 

    // Return the week of our adjusted day 
    return cal.GetWeekOfYear(pddate, System.Globalization.CalendarWeekRule.FirstFourDayWeek, System.DayOfWeek.Monday); 
} 

しかし、私はこれを実行すると私は得る:

Method 'Int32 GetYearWeekFormat(System.DateTime)' has no supported translation to SQL 

私は別の拡張子を作成することを決めた:

public static bool In<T>(this DateTime value, IEnumerable<Int32> values) 
{ 
    if (values == null) 
     throw new ArgumentNullException("values"); 
    int lnWeek = GetYearWeekFormat(value); 
    return values.Contains(lnWeek); 
} 

そして、このようにそれを呼ばれる:私は、これはどちらかの仕事を得ることができない場合を除き

var dq1 = (from c in tblschedulefulldates 
     where c.ddJobStart.In(doWeeksNeeded) 
     orderby c.diEmployeeID 
     select new 
     { 
      diEmployeeID = c.diEmployeeID == null ? 0 : (int)c.diEmployeeID, 
      dnDayOfWeek = c.ddJobStart.DayOfWeek == null ? 0 : (int)c.ddJobStart.DayOfWeek 
     }); 

。次のエラーが表示されます。

The type arguments for method 'DateTimeExtensions.In<T>(DateTime, IEnumerable<int>)' cannot be inferred from the usage. Try specifying the type arguments explicitly. 

誰かが助けてくれますか?

+0

これはEntity Frameworkで使用していますか? – MattC

+0

これはうまくいきません。すべてのクエリーが、特にGetYearWeekFormatのようなカスタムロジックを含むクエリーに変換できるわけではありません。 –

+0

これは古いシステムではありません。Linq 2 Sqlを使用しています - dbmlファイル – Wattcey

答えて

1

LINQ 2 SQLはGetYearWeekFormatをSQLに変換する方法を知りません。

まずデータベースにクエリを行い、次にローカルリストで作業する必要があります。

var localList = (from c in tblschedulefulldates 
    select new 
    { 
     ddJobStart= c.ddJobStart, 
     diEmployeeID= c.diEmployeeID, 
    }).ToList(); 

var dq1 = (from c in localList 
     where doWeeksNeeded.Contains(c.ddJobStart.GetYearWeekFormat()) 
     orderby c.diEmployeeID 
     select new 
     { 
      diEmployeeID = c.diEmployeeID == null ? 0 : (int)c.diEmployeeID, 
      dnDayOfWeek = c.ddJobStart.DayOfWeek == null ? 0 : (int)c.ddJobStart.DayOfWeek 
     });