Тернарные операторы недопустимы для запросов linq-to-sql? - PullRequest
0 голосов
/ 30 декабря 2010

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

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 Тернарные операторы? Я думаю, что раньше использовал троичные операторы, но я не могу вспомнить, делал ли я это в этой кодовой базе или другой кодовой базе (которая использует EF4 вместо L2S).

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

Ответы [ 2 ]

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

Измените DateAndTimeDisplayString так, чтобы он принимал другой тип аргумента и имел такой запрос:

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

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

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

Invoke(value(System.Func`1[System.String])))))
0 голосов
/ 30 декабря 2010

Рассматривали ли вы использование операции объединения нулей?(??)

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

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

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

...