私は3つのテーブルを持っています:
- USERS_TABLE(ユーザーID、名前)
- ACTIVITY_HISTORY_TABLE(ユーザー ID、開始日、開始日、アクティビティ ID)
- ACTIVITY_TABLE (アクティビティ ID、名前)
EFでは、これらはテーブルに対応する以下のエンティティです
- User(UserId,Name, AssignedActivities) AssignedActivities beeing ナビゲーション プロパティ
- ActivityHistory (UserId, DateFrom,DateTo,activityId,TheActivity) ナビゲーション プロパティである TheActivity
- 活動 (ActivityId、名前)
リクエスト時に行っているアクティビティを含むすべてのユーザーのリストを返す必要があります (ActivityHistory.Datefrom <= now および ActivityHistory.DateTo >= now)。
現在活動していないユーザーも返されます。
複数のアクティビティを持つユーザーは重複してはいけません
「User.AssignedActivities」と「ActivityHistory.TheActivity」をロードする必要があります(遅延ロードなし)。
これまでのところ、私のニーズの 1 つに失敗する 4 つのソリューションがあります。
1 - すべてのユーザーではなく、特定の時間にアクティビティがあるユーザーのみを返します
public List<User> GetAll()
{
using (Entities _db = new Entities())
{
return _db.USERS_TABLE
.Include("ActivityHistory")
.Include("ActivityHistory.Activity")
.Where(x => x.ActivityHistory.Any(y => y.DateFrom <= DateTime.Now && y.DateTo >= DateTime.Now))
.ToList();
}
}
2 - ユーザーの正しいリストを返します (重複なしで完了) が、アクティビティは読み込まれません (返されたリストで User.AssignedActivities を操作すると System.ObjectDisposedException)
(ここで見られる解決策:条件付きインクルードを使用したEFクエリ)
public List<User> GetAll()
{
using (Entities _db = new Entities())
{
var query = from users in _db.USERS_TABLE
select new
{
users,
assignments = from ActivityAssigned in users.AssignedActivities
.Where(y => y.DateFrom <= now && y.DateTo >= now)
.DefaultIfEmpty()
select ActivityAssigned
};
var query2 = query
.AsEnumerable()
.Select(x => x.users);
return query2.ToList();
}
}
3 - ユーザーが多くのアクティビティを持っていて、それらのアクティビティが読み込まれていない場合に重複を返します (返されたリストで User.AssignedActivities を操作すると System.ObjectDisposedException が発生します)。
(以下のSteve Rubleの解決策)
public List<User> GetAll()
{
using (Entities _db = new Entities())
{
var query =
from u in _db.USERS_TABLE
select new {
User = u,
CurrentActivities = u.ActivityHistory
.Where(y =>
y.DateFrom <= DateTime.Now
&& y.DateTo >= DateTime.Now)
.Select(ah => new
{
ActivityHistory = ah,
Activity = ah.Activity
}
}
return query.AsEnumerable().Select(x=> x.User).ToList();
}
}
4 - ActivityHistory エンティティのリポジトリを使用して、やりたいことを実行しますが、それを行うには永遠に時間がかかります。
public List<User> GetAll()
{
using (Entities _db = new Entities())
{
List<Users> MyUsersList = new List<Users>();
MyUsersList = _db.USERS_TABLE
.Include("ActivityHistory")
.Include("ActivityHistory.Activity")
.ToList();
for (int i = 0; i < MyUsersList.Count(); i++)
{
List<ActivityHistory > UserCurrentActivityList = new List<ActivityHistory >();
ActivityListRepository activityListRepo = new ActivityListRepository();
UserCurrentActivityList = activityListRepo.GetUserCurrentActivity(MyUsersList[i].UserId);
MyUsersList[i].AssignedActivities = UserCurrentActivityList;
}
return MyUsersList;
}
}
ヘルプ :) !