0

我试图在我的 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)中做到的。

这是真的,还是我错过了其他问题?

4

2 回答 2

1

修改 DateAndTimeDisplayString 以接受不同的参数类型并进行如下查询:

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

这样,你可以在你的代码中做三元的东西。

顺便说一句,实际上这部分看起来很糟糕,因为三进制被翻译成 IIF 并且似乎被处理了,也许尝试一个空字符串:

Invoke(value(System.Func`1[System.String])))))
于 2010-12-30T17:44:35.770 回答
0

您是否考虑过使用 Null 合并操作?(??)

您的代码将如下所示:

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

如果传递 null,您可以修改 DateAndTimeDisplayString 方法以返回 null。

于 2010-12-30T17:50:58.387 回答