我的代码看起来像:
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 为空,它会返回错误,因为 FindByIdAsync 正在使用空对象进行搜索。
我将如何过滤它以仅使用 FindByIdAsync 方法,如果 clientId != null 或只是返回" ",如果是的话。
我应该创建 2 个单独的 select 语句并连接它们吗?
我几乎在任何地方都放了 Where 子句,由于显而易见的原因,if 语句不起作用。提前感谢您的任何帮助。
Bookings
集合中包含的每个唯一clientId
值,您那里的内容将访问数据库一次。如果它是一个小集合,这将不是问题,但一旦它增长,它就会变得非常低效。更好的解决方案是根据集合中找到的客户端 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
的引用,则可以更进一步将其减少到一个调用。
尝试:clientEmail = a.ClientId == null ?" : _userManagerService.FindByIdAsync(a.ClientId(.Result.Email