LINQ to Entities не распознает метод - PullRequest
2 голосов
/ 27 декабря 2010

У меня проблема с Linq to Entities, для которой я не могу найти обходной путь.

Это мой код:

var queryResult = result.Where(x => x.FollowedUp.Value.GetWeekFromDateTime() 
    ==  DateTime.Now.GetWeekFromDateTime()).Select(x => x);

, и мой метод расширения:

    public static int GetWeekFromDateTime(this DateTime date)
    {
        return System.Threading.Thread.CurrentThread.CurrentCulture.Calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    }

Проблема:

Я получаю «LINQ to Entities не распознает метод GetWeekFromDateTime», и я понимаю, почему, потому что он пытается перевести мой код в код SQL и«GetWeekFromDateTime» не существует.Но как мне это сделать?Я хочу сравнить номер недели с датой, полученной из базы данных, с номером недели.

Спасибо!

Ответы [ 3 ]

7 голосов
/ 27 декабря 2010

Если у вас есть приличный индекс в поле FollowedUp, вы можете настроить свой алгоритм здесь, чтобы вместо этого просто вычислить с помощью C #, каковы минимальные и максимальные даты для текущей недели, и выполнить запрос как * 1002. * вместо. Таким образом, вы не выполняете вычисления для каждой строки базы данных.


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

Имейте в виду, что каждая строка будет проходить через эту функцию. Кроме того, даже если вы все еще хотите сделать это таким образом, вам также следует изменить способ получения текущей недели; Вам нужно получить это значение только один раз и использовать для него переменную в запросе ... не нужно пытаться пересчитать его для каждой строки.

1 голос
/ 27 декабря 2010

Linq-to-Entities в настоящее время не поддерживает специфичные для культуры функции запросов. См. Принятый ответ на этот вопрос для более подробной информации. Я считаю, что вам придется вернуть весь набор результатов в коллекцию, не относящуюся к L2E, которую затем можно отфильтровать с помощью метода GetWeekFromDateTime.

0 голосов
/ 27 декабря 2010

Вам придется либо извлечь все записи клиенту в виде массива или списка, а затем отфильтровать их с помощью запроса, аналогичного тому, который вы показали при работе с массивом (вместо только LINQ to SQL), или вам придется преобразовать его в синтаксис, понятный LINQ to SQL:

        int thisWeek = (DateTime.Now.DayOfYear + (int)(new DateTime(DateTime.Now.Year, 1, 1).DayOfWeek)) / 7;
        var queryResult =
            (from row in result
             let WeekNum = (row.FollowedUp.Value.DayOfYear +
            (int)(new DateTime(row.FollowedUp.Value.Year, 1, 1).DayOfWeek)) / 7
             where WeekNum == thisWeek
             select row);

LINQ to SQL на самом деле достаточно умен, чтобы преобразовать выражение WeekNum в код SQL следующим образом:

(DATEPART(DayOfYear, [t0].[FollowedUp]) + 
(CONVERT(Int,(DATEPART(dw, CONVERT(DATETIME, CONVERT(NCHAR(2), 1) + 
('/' + (CONVERT(NCHAR(2), 1) + ('/' + CONVERT(NCHAR(4), 
DATEPART(Year, [t0].[FollowedUp]))))), 101)) + 
(@@DATEFIRST) + 6) % 7))) / 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...