我有 3 张桌子:
- USERS_TABLE(用户名,名称)
- ACTIVITY_HISTORY_TABLE(userid, datefrom,dateto,activityId)
- ACTIVITY_TABLE(活动 ID,名称)
在 EF 中,这些是对应于表格的以下实体
- User(UserId,Name, AssignedActivities) 导航属性中的AssignedActivities
- ActivityHistory (UserId, DateFrom,DateTo,activityId,TheActivity) TheActivity 作为导航属性
- 活动(活动 ID、名称)
我需要返回一个包含所有用户的列表,包括他们在请求时正在进行的活动(ActivityHistory.Datefrom <= now 和 ActivityHistory.DateTo >= now)。
没有当前活动的用户也将被退回。
具有多个活动的用户不得重复
我需要加载“User.AssignedActivities”和“ActivityHistory.TheActivity”(没有延迟加载)。
到目前为止,我有 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 Query With Conditional Include)
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)
(史蒂夫卢布的解决方案如下)
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;
}
}
帮助 :) !