現在、ユーザーのサインイン回数、サインアウト回数などのユーザーアクティビティ統計を計算するために、以下のクエリを使用しています...正常に動作しています。しかし、以下のオブジェクトを1回だけ作成してコードを改善し、コードのUserActivityStatistics
重複を避け、以下のようにオブジェクトを2回作成したいと考えています。
private IList<UserActivityStatistics> ToUserActivityStatistics(DateTime fromDate, DateTime toDate, int pageIndex, int pageSize, Guid userId, ActivityType activity)
{
IList<UserActivityStatistics> userActivityStatistics = null;
if (userId == null || userId == Guid.Empty)
{
userActivityStatistics = (from u in SqlGetUserActivityStatistics(fromDate, toDate, userId, activity)
group u by new { u.Activity, u.UserId } into g
select g).AsEnumerable().Select(x => new UserActivityStatistics
{
Activity = Activity.GetActivityTypeName((ActivityType)x.Key.Activity),
ActivityCount = x.Count(),
UserId = x.Key.UserId,
UserName = x.Select(y => y.aspnet_Users.UserProfiles.FirstName + " " + y.aspnet_Users.UserProfiles.LastName).FirstOrDefault()
}).OrderByDescending(y => y.ActivityCount).Skip(pageIndex).Take(pageSize).ToList();
}
else
{
userActivityStatistics = (from u in SqlGetUserActivityStatistics(fromDate, toDate, userId, activity)
group u by u.Activity into g
select g).AsEnumerable().Select(x => new UserActivityStatistics
{
Activity = Activity.GetActivityTypeName((ActivityType)x.Key),
ActivityCount = x.Count(),
UserId = x.Select(y => y.aspnet_Users.UserProfiles.UserId).FirstOrDefault(),
UserName = x.Select(y => y.aspnet_Users.UserProfiles.FirstName + " " + y.aspnet_Users.UserProfiles.LastName).FirstOrDefault()
}).OrderByDescending(z => z.ActivityCount).Skip(pageIndex).Take(pageSize).ToList();
}
return userActivityStatistics;
}
UserActivityStatistics
オブジェクトを外側に移動し、queryable としてグループ化するという点で、以下のようなコードを改善しています。しかし、その照会可能なオブジェクトからカウントを計算できません。インターネットで検索しましたが、解決策がありませんでした。
その明確なことを願っています...
private IList<UserActivityStatistics> ToUserActivityStatistics(DateTime fromDate, DateTime toDate, int pageIndex, int pageSize, Guid userId, ActivityType activity)
{
IList<UserActivityStatistics> userActivityStatistics = null;
IQueryable<ActivityLog> activityLog = null;
if (userId == null || userId == Guid.Empty)
{
activityLog = (from u in SqlGetUserActivityStatistics(fromDate, toDate, userId, activity)
select u).GroupBy(x => new { x.Activity, x.UserId }).SelectMany(x => x);
}
else
{
activityLog = (from u in SqlGetUserActivityStatistics(fromDate, toDate, userId, activity)
select u).GroupBy(x => new { x.Activity}).SelectMany(x => x);
}
userActivityStatistics = (from u in activityLog
select u).AsEnumerable().Select(x => new UserActivityStatistics
{
Activity = Activity.GetActivityTypeName((ActivityType)x.Activity),
ActivityCount = //unable to do count
UserId = x.UserId
}).OrderByDescending(x => x.ActivityCount).Skip(pageIndex).Take(pageSize).ToList();
return userActivityStatistics;
}