2015-08-13 3 views
0

Я пытаюсь получить данные из базы данных, где table.Date.WeekDayThing = DateTime.Now.WeekDayThing (см ниже методы), но я получаю ошибкуполучить только данные из БД соответствия текущей недели

LINQ для лиц, не признающих метод 'Int32 GetIso8601WeekOfYear (System.DateTime)', и этот метод не может быть преобразован в выражение хранилища .

запросов LINQ

var dbHours = DAO.Instance.HourRegistration 
    .Where(x => x.Login_ID == logId && x.Cust_ID == custId && GetIso8601WeekOfYear(x.Date) == GetIso8601WeekOfYear(DateTime.Now)) 
    .Include(x => x.Customer) 
    .ToList(); 

Метод GetIso8601WeekOfYear (DateTime время)

public int GetIso8601WeekOfYear(DateTime time) 
    { 
     // 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 
     DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time); 
     if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday) 
     { 
      time = time.AddDays(3); 
     } 

     // Return the week of our adjusted day 
     return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); 
    } 

Кто-нибудь знает, как решить эту проблему?

ответ

2

Одним из вариантов являются для выборки данных, и применить недельный фильтр после этого:

var dbHours = DAO.Instance.HourRegistration 
    .Where(x => x.Login_ID == logId && x.Cust_ID == custId) 
    .Include(x => x.Customer) 
    .ToList() 
    .Where(x => GetIso8601WeekOfYear(x.Date) == GetIso8601WeekOfYear(DateTime.Now)); 

Если вы думаете, что вернет слишком большое количество результатов, можно фильтровать, например, только вернуть последние 7 дней данные, которые будут гарантировать текущую неделю.

Другой вариант переписать вашу функцию в EntityFunctions, как описано здесь: LINQ to Entities: Age calculation in a LINQ query causes "Method cannot be translated into a store expression"

+0

@Detilium, он никогда не будет работать, как вы пишете, GetIso8601WeekOfYear не может работать с SQL Server.Вы можете запустить запрос, предложенный Horia, но позаботиться о масштабируемости, потому что предлагаемый запрос извлекает все данные всех недель в памяти (также разрешает отношения с клиентами), а затем фильтрует фактическую неделю, поэтому обычно он выбирает 52/2 = 26 раз необходимые записи (в конце года 52 раза). – bubi

+0

Вот почему я сказал, чтобы отфильтровать данные, чтобы вернуть только последние 7 дней с условием типа && x.Date> = DateTime.Today.AddDays (-7) 'в первом' Where'. – Horia

+0

Придавая '&& x.Date> = DateTime.Now.AddDays (-7)' дает ту же ошибку, что и мой первоначальный вопрос – Detilium

0

В LINQ для EF можно использовать только при поддержке функции, канонические функции (единственный, который должен быть поддержан всеми поставщиками эф) или функций, поддерживаемых вашим провайдером (SQL Server).

В этом случае у вас есть два разных подхода: вы можете написать хранимую процедуру для решения всего запроса, а затем сопоставить его с EF или вы можете взорвать запрос, используя только поддерживаемые функции.

DateTime Канонические функции: https://msdn.microsoft.com/en-us/library/vstudio/bb738563(v=vs.100).aspx

SQL Server функции поставщика EF: https://msdn.microsoft.com/en-us/library/vstudio/bb399545(v=vs.100).aspx

В вашем случае правая функция DatePart (смешанная с некоторыми проверками).

EDIT

Существует всегда решение материализовать запрос «ранний» (положить ToList рано, то работать в памяти), но это означает, что вы запрашиваете больше данных, чем вам нужно.

EDIT2

SQL Server DATEPART уже способ получить неделю, используя стандарт ISO. Ваш запрос LINQ должен быть таким (но я не пробовал).

.Where(x => x.Login_ID == logId && x.Cust_ID == custId && SqlFunctions.DatePart("ISO_WEEK", x.Date) == SqlFunctions.DatePart(DateTime.Now)) 

Reference являются ссылки выше и https://msdn.microsoft.com/en-us/library/ms174420.aspx

+0

Не могли бы вы привести пример DATEPART в моем контексте? – Detilium

+0

Какое пространство имен является Sqlserver? VS дает мне 2 варианта: Microsoft.SqlServer и System.Data.Entity.SqlServer? – Detilium

+0

System.Data.Entity.SqlServer – bubi

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