我的代码如下:
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语句由于显而易见的原因不起作用。感谢您提前提供任何帮助。
答案 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