我需要从两个查询中创建一个新模型。我有会员实体和 MemberTeam 实体,两者都互相引用。我需要的是所有成员列表,并知道该成员是否已分配给特定团队。
我目前有以下代码可行,但对我来说似乎很笨,我希望有人有一个更好的方法来创建这个组合列表只使用Linq语句(没有foreach)。基本上,代码获取所有成员的列表,获取分配给团队的另一个成员列表,然后使用foreach循环查看该成员是否已分配给团队。
int teamId = 1;
var model = new SelectedMemberListModel();
List<Member> allMembers = _unitOfWork.RepositoryFor<Member>().All().ToList();
List<Member> teamMembers = _unitOfWork.RepositoryFor<MemberTeam>().AllIncluding(x => x.Members).Single(x => x.Id == teamId).Members.ToList();
List<SelectedMemberModel> membersWithTeamSelected = new List<SelectedMemberModel>();
foreach (var member in allMembers)
{
SelectedMemberModel selectedMemberModel = new SelectedMemberModel();
selectedMemberModel.FirstName = member.FirstName;
selectedMemberModel.LastName = member.LastName;
if(teamMembers.Contains(member))
{
selectedMemberModel.Selected = true;
}
membersWithTeamSelected.Add(selectedMemberModel);
}
如果需要更好地理解我的模型,这是我的实体:
public class Member
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int TeamId { get; set; }
public virtual MemberTeam Team { get; set; }
//... Other properties here...
}
public class MemberTeam
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Member> Members { get; set; }
}
public class SelectedMemberModel
{
public int MemberId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public bool Selected { get; set; }
}
答案 0 :(得分:1)
我不完全确定我是否理解正确 - 但我认为这些可能是您需要的查询?
这个将返回一个列表...模型对象仅适用于选定的成员(teamMembers列表中的成员):
var assignedOnly = allMembers
.Where(m => teamMembers.Contains(m))
.Select(m => new SelectedMemberModel() {
FirstName = m.FirstName, LastName = m.LastName,
Selected = true, MemberId = m.Id});
此查询应将所有成员返回为...模型对象,其中所选属性的设置基于与上述相同的条件:
var allToModel = from m in allMembers
let selected = teamMembers.Contains(m)
select new SelectedMemberModel() {
FirstName = m.FirstName, LastName = m.LastName,
Selected = selected, MemberId = m.Id };
无论如何,我不希望这比foreach循环更有效。
<强>更新强>
好吧,我误解了意图 - 我以为你想摆脱foreach所以我忽略了循环之外的任何东西,但是只做一次db调用是完全合理的。
我对实体框架并不太熟悉,但我认为以下linq语句就足够了 - 它只在allMembers列表上运行,使用teamId值来评估成员是否在所选团队中。
如果能解决您的问题,请告诉我。
var selectedMemberModelList = allMembers
.Select(m => new SelectedMemberModel() {
FirstName = m.FirstName, LastName = m.LastName,
MemberId = m.Id, Selected = m.Id == teamId})
.ToList();