我有一个具有用户的站点,我有一种API方法来显示用户的最新活动:
public List<UserActivity> GetUserActivity(Guid userId)
{
return _dbContext.UserActivity
.Where(ua => ua.UserId.Equals(userId))
.OrderByDescending(ua => ua.ActivityTime)
.Take(20)
.ToList();
}
这些是我要返回的对象:
public class UserActivity
{
public Guid UserId { get; set; }
public DateTime ActivityTime { get; set; }
public string ActivityTitle { get; set; }
}
我正在在数据库中存储ActivityTime
的所有日期。每个用户都可以设置所在的时区,因此我想将ActivityTime
转换为其时区,以在调用此API方法时在前端显示。
类似的东西:
public List<UserActivity> GetUserActivity(Guid userId)
{
MyUser user = _dbContext.MyUsers.FirstOrDefault(u => u.Id.Equals(userId));
TimeZoneInfo userTimeZone = TimeZoneInfo.FindSystemTimeZoneById(user.TimeZoneId);
return _dbContext.UserActivity
.Where(ua => ua.UserId.Equals(userId))
.OrderByDescending(ua => ua.ActivityTime)
.Take(20)
// somehow call TimeZoneInfo.ConvertTimeFromUtc on ActivityTime here
.ToList();
}
,但我不确定如何在集合中的属性上调用TimeZoneInfo.ConvertTimeFromUtc
来转换所有这些。有办法做到吗?
在内存中拥有所有UserActivity
数据后,您就可以转换它。
var activities = ...;
TimeZoneInfo userZone = TimeZoneInfo.FindSystemTimeZoneById(user.TimeZoneId);
foreach (var thisActivity in activities)
{
DateTime localTime =
TimeZoneInfo.ConvertTimeFromUtc(thisActivity.ActivityTime, userZone);
thisActivity.ActivityTime = localTime;
}
您需要做的重要的事情是在 呼叫 ToList()
for entityframework dbset。
这是一个通过投影您的实体来使用LINQ的示例:
public List<UserActivity> GetUserActivity(Guid userId)
{
MyUser user = _dbContext.MyUsers.FirstOrDefault(u => u.Id.Equals(userId));
TimeZoneInfo userTimeZone = TimeZoneInfo.FindSystemTimeZoneById(user.TimeZoneId);
var activities = _dbContext.UserActivity
.Where(ua => ua.UserId.Equals(userId))
.OrderByDescending(ua => ua.ActivityTime)
.Take(20)
.ToList();
return activities.Select(a => new UserActivity
{
UserId = a.Userid,
ActivityTitle = a.ActivityTitle,
ActivityTime = TimeZoneInfo.ConvertTimeFromUtc(a.ActivityTime, userTimeZone)
}).ToList();
}