Как правильно получить сортируемую строку из DateTime в сущности LINQ? - PullRequest
4 голосов
/ 16 марта 2011
// EmployeeService:
[WebMethod]
public List<Employee> GetEmployees()
{
    return
        (
            from p in db.Persons
            where p.Type == 'E'
            select new Employee
            {
                Name = p.FullName,
                //HireDate = p.CreationDate.ToString(), 
                // works, but not in the format I need

                //HireDate = p.CreationDate.ToString("s"), 
                // throws a NotSupportedException

                //HireDate = Wrapper(p.CreationDate), 
                // works, but makes me worry about performance 
                // and feel dead inside
            }
        ).ToList<Employee>();
}

private String Wrapper(DateTime date)
{
    return date.ToString("s");
}

// Elsewhere:
public class Employee
{
    public String Name;
    public String HireDate;
}

Я использую JavaScript-фреймворк, которому нужны даты в формате ISO 8601, и это именно то, что вызовет .ToString("s") для объекта DateTime.

Есть ли более чистый / более эффективный способ сделать это в LINQ to SQL?

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

Я считаю, что трюк Wrapper настолько хорош, насколько это возможно в этой ситуации. К сожалению.

Обновление: Похоже, здесь снова задали этот вопрос: Linq to Sql - формат даты и времени - ГГГГ-МММ (2009-март) . Ответ был в значительной степени "извините" там тоже; учитывая, кто участвовал в этом вопросе, теперь я действительно уверен, что вы не можете добиться большего успеха.

0 голосов
/ 16 марта 2011

Проблема в том, что при использовании IQueryable провайдер пытается преобразовать все выражения LINQ во что-то, что он может отправить в базу данных. Он не может знать, что делать с ToString("s"), поэтому выдается исключение NotSupported.

Если вы добавите .AsEnumerable() перед вызовом Select, это должно сработать. Разница в том, что объект Person будет полностью занесен в память, затем будет запущен метод проекции (Select), и все это будет сделано как скомпилированный метод .NET, а не как SQL. Таким образом, все, что после AsEnumerable() будет выполнено в памяти, а не в базе данных, поэтому обычно делать это не рекомендуется, пока вы не урежете количество строк настолько, насколько это возможно (т.е. после Where и OrderBy s).

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