如何解决绑定两个列表与列匹配
我有两个项目列表,如下所示:
List A
Id Hobbies Category
1 Dance A
1 Reading Book A
2 Reading Book A
2 Gardening A
List B
Id ContactNo
1 123456
1 7891011
2 121314
2 151617
我正在尝试的很简单,只是获得以下输出:
Id Hobbies ContactNo
1 Dance 123456
Reading Book 7891011
2 Reading Book 121314
Gardening 151617
尝试了以下操作,但它给了我这个例外- DbExpressionBinding需要具有集合ResultType的输入表达式。参数名称:输入
aLst = (from c in Hobbies
join d in Contact on c.Id equals d.Id
where c.Category == "A"
select new Model
{
Id = c.Id,AllHobbies = c.Hobbies.Select(c => c.ToString()).ToList(),AllContacts = c.ContactNo.Select(c => c.ToString()).ToList(),}).ToList();
解决方法
最简单的解决方案是首先将兴趣爱好和联系人分组,然后将它们组合:
var groupedHobbies = from h in Hobbies
group h by h.ID;
var groupedContacts = from c in Contact
group c by c.ID;
var ans = (from hg in groupedHobbies
join cg in groupedContacts on hg.Key equals cg.Key into cgj
from cg in cgj.DefaultIfEmpty()
select new {
ID = hg.Key,Hobbies = hg.Select(h => h.Hobbies).ToList(),ContactNos = cg != null ? cg.Select(c => c.ContactNo).ToList() : Enumerable.Empty<string>()
})
.ToList();
,
使用群组加入,加入之前我正在过滤“ A”类别的兴趣爱好。
aLst = (from c in Hobbies.Where(x=>x.Category=="A").Select(x=>x).ToList()
join d in Contact on c.Id equals d.Id into grp
select new Model
{
Id = c.Id,AllHobbies = grp.Select(c => c.Hobbies).ToList(),AllContacts = grp.Select(c => c.ContactNo).ToList(),}).ToList();
,供您参考:
假设这些是上述数据的适当类别:
public class Hobbies
{
public int Id { get; set; }
public string Hobby { get; set; }
public string Category { get; set; }
}
public class ContactInfo
{
public int Id { get; set; }
public string ContactNo { get; set; }
}
请选择以下方法之一:
var result = hobbies
.Where(h => h.Category == "A") // you can apply filtering for a Category here
.GroupJoin(contacts,hobby => hobby.Id,contact => contact.Id,(hobby,contact) => new
{
Id = hobby.Id,Hobby = hobby.Hobby,Contacts = contact.Select(c => c.ContactNo)
});
OR
var result = hobbies
.Where(h => h.Category == "A") // you can apply filtering for a Category here
.Join(contacts,h => h.Id,c => c.Id,(h,c) => new {h.Id,Hobby = h.Hobby,ContactNo = c.ContactNo})
.GroupBy(r => r.Id)
.Select(grp => new
{
Id = grp.Key,// this Id is the same for both Hobby and Contact
HobbieContacts = grp.Select(i => new
{
ContactNo = i.ContactNo,Hobby = i.Hobby
})
});
请注意,在上面的示例中,我使用了匿名类型进行演示。但是,我个人的建议是改用实型类。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。