CurrentUtcDateTime не существует - Entity Framework и MySql - PullRequest
2 голосов
/ 10 августа 2011

У меня проблема с каноническими функциями в Entity Framework 4.1 и MySql Connector / Net 6.4.3. Согласно Microsoft, канонические функции поняты и переведены на местный диалект SQL всеми поставщиками баз данных из SQL, сгенерированного LINQ; http://msdn.microsoft.com/en-us/library/bb738626.aspx Однако мой код захлебывается CurrentUtcDateTime (), который указан здесь; http://msdn.microsoft.com/en-us/library/bb738563.aspx

Вот запрос LINQ (от NopCommerce), который генерирует оскорбительный SQL:

    public List<Poll> GetPolls(int languageId, int pollCount, bool loadShownOnHomePageOnly)
    {
        bool showHidden = NopContext.Current.IsAdmin;


        var query = (IQueryable<Poll>)_context.Polls;
        if (!showHidden)
        {
            query = query.Where(p => p.Published);
            query = query.Where(p => !p.StartDate.HasValue || p.StartDate <= DateTime.UtcNow);
            query = query.Where(p => !p.EndDate.HasValue || p.EndDate >= DateTime.UtcNow);
        }
        if (loadShownOnHomePageOnly)
        {
            query = query.Where(p => p.ShowOnHomePage);
        }
        if (languageId > 0)
        {
            query = query.Where(p => p.LanguageId == languageId);
        }

        query = query.OrderBy(p => p.DisplayOrder);
        if (pollCount > 0)
        {
            query = query.Take(pollCount);
        }

        var polls = query.ToList();

        return polls;
    }

query.ToList () генерирует SQL ниже:

SELECT`Project1`.`PollID`, `Project1`.`LanguageID`, `Project1`.`Name`, 
`Project1`.`Published`, `Project1`.`ShowOnHomePage`, `Project1`.`DisplayOrder`, 
`Project1`.`SystemKeyword`, `Project1`.`StartDate`, `Project1`.`EndDate`
FROM (SELECT`Extent1`.`PollID`, `Extent1`.`LanguageID`, `Extent1`.`Name`, 
`Extent1`.`SystemKeyword`, `Extent1`.`Published`, `Extent1`.`ShowOnHomePage`, 
`Extent1`.`DisplayOrder`, `Extent1`.`StartDate`, `Extent1`.`EndDate`
FROM `Nop_Poll` AS `Extent1` WHERE ((((`Extent1`.`Published` = 1) AND 
((`Extent1`.`StartDate` IS  NULL) OR (`Extent1`.`StartDate` <= (CurrentUtcDateTime())))) 
AND ((`Extent1`.`EndDate` IS  NULL) OR (`Extent1`.`EndDate` >= (CurrentUtcDateTime())))) 
AND (`Extent1`.`ShowOnHomePage` = 1)) AND (`Extent1`.`LanguageID` = @p__linq__0)) 
AS `Project1` ORDER BY `Project1`.`DisplayOrder` ASC LIMIT 2147483647

Это ошибка считается:

*FUNCTION myDatabase.CurrentUtcDateTime does not exist 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
Exception Details: MySql.Data.MySqlClient.MySqlException: FUNCTION myDatabase.CurrentUtcDateTime does not exist*

Я что-то упустил? Пожалуйста посоветуй. Спасибо.

Ответы [ 3 ]

10 голосов
/ 02 сентября 2011

Я столкнулся с точно такой же проблемой и потерял почти два дня, пытаясь ее решить. Кажется, это ошибка в отображениях EntityFramework для MySql.

Решение состоит в том, чтобы переместить вычисление DateTime.UtcNow за пределы лямбды с заданной областью и вставить фактическое значение.

var utcNow = DateTime.UtcNow;
query = query.Where(p => p.Published);
query = query.Where(p => !p.StartDate.HasValue || p.StartDate <= utcNow);
query = query.Where(p => !p.EndDate.HasValue || p.EndDate >= utcNow);
1 голос
/ 14 декабря 2011

Основываясь на предложении Богемяна, я исправил эту проблему с помощью функции «обхода».

CREATE FUNCTION `your_schema`.`CurrentUtcDateTime` ()
RETURNS TIMESTAMP DETERMINISTIC
RETURN UTC_TIMESTAMP();
0 голосов
/ 11 августа 2011

Использовать UTC_TIMESTAMP ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...