如果FindByIdAsync,Id为null,该怎么办?

时间:2017-06-09 16:22:37

标签: c# json entity-framework asp.net-core asp.net-identity

我的代码如下:

IEnumerable<Booking> Bookings = _repoBooking.GetAll.OrderBy(d => d.BookingDateTime).ToList();

return Json(listErrorMsg(Bookings.Select(a => new
{
    bookingId = a.BookingId,
    bookingDateTime = a.BookingDateTime,
    jobType = a.JobType,
    bookingStatus = a.BookingStatus,
    projectId = a.ProjectId,
    clientId = a.ClientId,
    clientEmail = _userManagerService.FindByIdAsync(a.ClientId).Result.Email
})));

正确的JSON对象如下所示:

 {
   "bookingId": 7016,
   "bookingDateTime": "2017-06-13T17:00:00",
   "jobType": "Quote",
   "bookingStatus": "Pending",
   "projectId": 343,
   "clientId": "01d85u46-b753-8635-ba3b-a6458cbv2425",
   "clientEmail": "fake@fakemail.com"
 }

但是,我遇到的问题是,如果ClientId为null,它将返回一个错误,因为FindByIdAsync使用空对象进行搜索。

如果clientId!= null,我将如何过滤它以仅使用FindByIdAsync方法,如果是,则返回“”。

我应该创建2个单独的select语句并加入吗?

我几乎到处都放置Where子句,if语句由于显而易见的原因不起作用。感谢您提前提供任何帮助。

2 个答案:

答案 0 :(得分:0)

对于clientId集合中包含的每个唯一Bookings值,您所拥有的内容将会访问数据库一次。如果它是一个小集合,这不会是一个问题,但一旦它增长它将变得非常低效。更好的解决方案是根据集合中找到的客户端ID获取所有用户的电子邮件地址。

var Bookings = _repoBooking.GetAll.OrderBy(d => d.BookingDateTime).ToList();
var clientIds = Bookings.Where(x => x.ClientId != null).Select(x => x.ClientId).ToList();
var emailLookup = _userManagerService.Users.Where(user => clientIds.Contains(user.Id)).ToDictionary(x => x.Id, x => x.Email);

将行clientEmail =...替换为

clientEmail = a.ClientId != null ? emailLookup[a.ClientId] : ""

现在您只有2个数据库调用,一个用于获取预订,另一个用于获取电子邮件地址列表。如果您修改Booking关系以包含对User的引用,则可以更进一步将其缩减为一个调用。

答案 1 :(得分:-1)

尝试: clientEmail = a.ClientId == null? &#34;&#34; :_userManagerService.FindByIdAsync(a.ClientId).Result.Email