2010-12-30 3 views
0

Я пытаюсь отобразить время с датой NULL в своем ответе JSON. В моей MVC контроллер Я бегу следующий запрос:Являются ли тройные операторы недействительными для запросов linq-to-sql?

var requests = 
    (from r in _context.TestRequests 
    where r.scheduled_time == null && r.TestRequestRuns.Count > 0 
    select new 
    { 
     id = r.id, 
     name = r.name, 
     start = DateAndTimeDisplayString(r.TestRequestRuns.First().start_dt), 
     end = r.TestRequestRuns.First().end_dt.HasValue 
       ? DateAndTimeDisplayString(r.TestRequestRuns.First().end_dt.Value) 
       : string.Empty 
     }); 

Когда я бегу requests.ToArray() я получаю следующее исключение:

Could not translate expression ' 
Table(TestRequest) 
    .Where(r => 
    ((r.scheduled_time == null) AndAlso (r.TestRequestRuns.Count > 0))) 
    .Select(r => new <>f__AnonymousType18`4(id = r.id, name = r.name, 
      start = value(QAWebTools.Controllers.TestRequestsController). 
       DateAndTimeDisplayString(r.TestRequestRuns.First().start_dt), 
      end = IIF(r.TestRequestRuns.First().end_dt.HasValue, 
       value(QAWebTools.Controllers.TestRequestsController). 
      DateAndTimeDisplayString(r.TestRequestRuns.First().end_dt.Value), 
       Invoke(value(System.Func`1[System.String])))))' 
into SQL and could not treat it as a local expression. 

Если я закомментируйте end = линию, все, кажется, правильно работать, так это, похоже, не использование моего локального метода DateAndTimeDisplayString, поэтому единственное, что я могу придумать, это Linq to Sql, не нравится терминам Ternary? Я думаю, что раньше я использовал тернарные операторы, но не могу вспомнить, сделал ли я это в этой базе кода или другой кодовой базе (которая использует EF4 вместо L2S).

Это правда, или я пропустил какую-то другую проблему?

ответ

1

Изменить DateAndTimeDisplayString принять другой тип аргументов и есть запрос, как это:

end = DateAndTimeDisplayString(r.TestRequestRuns.FirstOrDefault()) 

Таким образом, вы можете сделать тройные вещи в вашем коде.

Кстати, это на самом деле это часть, которая выглядит плохо, потому что тройная переводится на IIF и, кажется, будет обрабатываться, может быть, попробовать пустую строку:

Invoke(value(System.Func`1[System.String]))))) 
+0

Вы правы! Изменение 'string.empty' до нулевого результата! – KallDrexx

+0

Lucky guess :) Знаете, что вы должны сообщить об этом на http://connect.microsoft.com – fejesjoco

0

Рассматривали ли вы с помощью коалесцирующий Operationg Null ? (??)

Ваш код будет выглядеть следующим образом:

end = r.TestRequestRuns.First().end_dt ?? string.Empty 

Вы можете изменить свой метод DateAndTimeDisplayString вернуть нулевое значение, если прошло нуль.

+0

Я действительно рассматривал использование '??', но end_dt является 'DateTime? ', И если вы пытаетесь использовать? вы получаете сообщение об ошибке? не может применяться к DateTime? и строка. – KallDrexx

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