Работа с DateTime с использованием "методов Linq" - PullRequest
3 голосов
/ 06 июня 2011

[ASP.NET 4.0 / EF 4.1]

Привет,

Я пытаюсь использовать "методы Linq" для фильтрации источника данных на основе полей даты и времени, но я получаюошибка: «В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid»).

Я знаю, что Entity Framework имеет некоторые ограничения при работе с датами, но мне нужно следующеекакое-то элегантное решение для решения этой проблемы.

Мой код:

    public IList<Order> GetOrders(int? orderId = null, string customerId = null, int? employeeId = null, DateTime? orderDateFrom = null, DateTime? orderDateUntil=null, DateTime? requiredDate = null, DateTime? shippedDate = null)
    {
        IQueryable<Order> result;

        result = from order in ctx.Orders.Include("Order_Details")
                 select order;

        // Apply filters to the base query
        if (orderId != null)
            result = result.Where(o => o.OrderID.Equals(orderId));

        if (!String.IsNullOrEmpty(customerId))
            result = result.Where(o => o.CustomerID.ToUpper().Equals(customerId.ToUpper()));

        if (employeeId != null)
            result = result.Where(o => o.EmployeeID.Equals(employeeId));

        if (orderDateFrom != null)
            result = result.Where(o => o.OrderDate >= orderDateFrom);

        if (orderDateUntil != null)
            result = result.Where(o => o.OrderDate <= orderDateUntil);

        if (requiredDate != null)
            result = result.Where(o => o.RequiredDate == requiredDate);

        if (shippedDate != null)
            result = result.Where(o => o.ShippedDate == shippedDate);

        return result.ToList();
    }

Когда код выполняет запрос (result.ToList ()), он генерирует исключение.Если я уберу предложение datetime .Where, оно будет работать нормально.

Спасибо!

Решение

Я изменил свой код на:

    public IList<Order> GetOrders(int? orderId = null, string customerId = null, int? employeeId = null, DateTime? orderDateFrom = null, DateTime? orderDateUntil=null, DateTime? requiredDate = null, DateTime? shippedDate = null)
    {
        IQueryable<Order> result;

        result = from order in ctx.Orders.Include("Order_Details")
                 select order;

        // Apply filters to the base query
        if (orderId != null)
            result = result.Where(o => o.OrderID.Equals(orderId.Value));

        if (!String.IsNullOrEmpty(customerId))
            result = result.Where(o => o.CustomerID.ToUpper() == customerId.ToUpper());

        if (employeeId != null)
            result = result.Where(o => o.EmployeeID == employeeId.Value);

        if (orderDateFrom != null)
            result = result.Where(o => o.OrderDate >= orderDateFrom.Value);

        if (orderDateUntil != null)
            result = result.Where(o => o.OrderDate <= orderDateUntil.Value);

        if (requiredDate != null)
            result = result.Where(o => o.RequiredDate == requiredDate.Value);

        if (shippedDate != null)
            result = result.Where(o => o.ShippedDate == shippedDate.Value);

        return result.ToList();
    }

Если у кого-то есть лучшее решение, пожалуйста, дайте мне знать.

1 Ответ

4 голосов
/ 06 июня 2011

Вы используете обнуляемый тип DateTime? в вашем примере. Я не уверен, что ваш столбец базы данных допускает NULL, но я бы использовал date.Value для передачи значения параметра, чтобы быть уверенным, что EF не упадет. Обратите внимание, что с обнуляемыми типами вы также можете использовать свойство HasValue, чтобы проверить, содержит ли ваш параметр правильное значение. В результате:

if (orderDateFrom.HasValue)
   result = result.Where(o => o.OrderDate >= orderDateFrom.Value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...