2014-09-11 3 views
2

Я хотел бы проверить, соответствует ли текущая дата ввода той же неделе, что и мои временные метки в базе данных. Я делаю это, просматривая номер недели.Проверить первый день недели в заявлении LINQ

Я пытаюсь использовать:

Calendar.GetWeekOfYear(DateTime, ...) 

метод, который обычно работает.

Однако, когда я использую LINQ, я получаю:

An exception of type 'System.NotSupportedException' occurred in System.Data.Entity.dll but was not handled in user code 

Additional information: LINQ to Entities [...] 

Мой код:

var ordersWeek = orders.Where(c => 
       (EntityFunctions.TruncateTime(c.Timestamp).Value.Year == EntityFunctions.TruncateTime(DateTime.Now).Value.Year) && 
       (EntityFunctions.TruncateTime(c.Timestamp).Value.StartOfWeek(DayOfWeek.Monday) == EntityFunctions.TruncateTime(DateTime.Now).Value.StartOfWeek(DayOfWeek.Monday)) 
       ).ToList(); 

В данном коде я пытаюсь использовать этот метод расширения:

public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek) 
    { 
     int diff = dt.DayOfWeek - startOfWeek; 
     if (diff < 0) 
     { 
      diff += 7; 
     } 

     return dt.AddDays(-1 * diff); 
    } 

Что является лучшим способ сделать это в LINQ? Помните, что вы не можете использовать функцию .Date.

+0

LINQ для лиц является весьма ограниченным по сравнению с LINQ к объектам. Пожалуйста, опубликуйте полное выражение LINQ. – Dennis

+1

Если вы используете Linq для Entities, это будет причиной того, что он терпит неудачу. Существует не поддерживается способ перевода этого метода в sql. Попробуйте использовать метод за пределами sql, а затем присоединитесь к нему. – paqogomez

+0

Как бы вы пишете его в SQL, без LINQ? Сначала посмотрите на это, а затем выясните, как сопоставить это с LINQ. – Servy

ответ

2

Ваш метод расширения StartOfWeek просто виден вашему C# -коду, нет возможности для преобразования сущности в базовый язык источника данных (возможно, SQL). Аналогично, если вы попытаетесь использовать Calendar.GetWeekOfYear, он потерпит неудачу по той же причине, что и EF не сможет его перевести.

Вместо этого вы можете сделать:

  • Вычислить Дата начала и Дата окончания для Недели
  • Используйте этот диапазон для запроса в запросе LINQ, как c.TimeStamp >= StartDate && c.TimeStamp <= EndDate

Код:

DateTime startDate = dt.StartOfWeek(DayOfWeek.Monday); 
DateTime endDate = startDate.AddDays(6); 

С помощью вашего метода расширения:

public static class MyExtension 
{ 
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek) 
    { 
     int diff = dt.DayOfWeek - startOfWeek; 
     if (diff < 0) 
     { 
      diff += 7; 
     } 

     return dt.AddDays(-1*diff); 
    } 
} 

, а затем в запросе LINQ:

var ordersWeek = orders.Where(c => 
       (EntityFunctions.TruncateTime(c.Timestamp).Value.Year == EntityFunctions.TruncateTime(DateTime.Now).Value.Year) && 
       (EntityFunctions.TruncateTime(c.Timestamp).Value >= startDate && 
       EntityFunctions.TruncateTime(c.Timestamp).Value <= endDate) 
       .ToList(); 
+0

Кажется, что проблема с этим ... подпись метода расширения должна иметь «этот DateTime dt», , Или, по крайней мере, это то, что я должен был сделать, чтобы заставить его работать в моем решении. В противном случае, отличный ответ. –

+0

@SailingJudo, вы абсолютно правы, так или иначе я пропустил это, пожалуйста, не стесняйтесь редактировать себя в будущем, спасибо, что указали это. – Habib

Смежные вопросы