【问题标题】:What if the FindByIdAsync, Id is null如果 FindByIdAsync, Id 为空怎么办
【发布时间】:2017-06-09 16:22:37
【问题描述】:

我的代码如下:

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 正在使用空对象进行搜索。

如果 clientId != null 或仅返回“”,我将如何对其进行过滤以仅使用 FindByIdAsync 方法(如果是)。

我应该创建 2 个单独的选择语句并加入它们吗?

我几乎在所有地方都放置了 Where 子句,而 if 语句由于显而易见的原因无法正常工作。感谢您提前提供任何帮助。

【问题讨论】:

  • 你为什么要创建一个新的匿名对象来序列化?为什么不等待_userManagerService.FindByIdAsync(a.ClientId)的结果@
  • 为什么不在自定义上下文中创建一个用户表并将电子邮件存储在那里?然后您可以使用普通的 Id (int) 并将您的表格与该表格相关联。这将使事情变得容易得多。有两个单独的上下文:标识用户的身份上下文和您的业务信息的自定义上下文。保持两个上下文分开。如果做得好,除了登录时,您将不需要身份上下文。因为您需要的信息应该在您的自定义上下文中(因此您只需要一个查询)并且对于当前用户,您可以使用带有附加信息的声明。

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


【解决方案1】:

对于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 个数据库调用,一个用于获取 Bookings,一个用于获取电子邮件地址列表。如果您修改 Booking 关系以包含对 User 的引用,您可以更进一步并将其减少到一个调用。

【讨论】:

    【解决方案2】:

    尝试: clientEmail = a.ClientId == null ? "" : _userManagerService.FindByIdAsync(a.ClientId).Result.Email

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-06
      • 2010-11-25
      • 2017-02-12
      • 2022-12-09
      • 2021-03-17
      • 2011-06-22
      • 2017-12-20
      • 1970-01-01
      相关资源
      最近更新 更多