我正在尝试使用包含父/子关系表(1:n)的select语句来生成自定义实体。我试图对所选对象进行分组,但是我无法提出解决方案。
我的数据是这种格式:
ParentTable
Userid | Col1 | Col2 | ... | Coln
ChildTable:
Id | Userid | Col1 | Col2 | ... | Coln
我想要生成的结果对象是:
Custom { UserID, IEnumerable<ChildTable> }
我写了一个查询:
from parent in db.ParentTable
join child in db.ChildTable on new { Userid = parent.Id } equals new { Userid = child.Userid } into child_join
from child in child_join.DefaultIfEmpty()
where
child.Col1 == Argument1 &&
child.Col2 == Argument2
select new {
Username = parent.Username,
child.Col1,
child.Col2,
child.Col3,
child.Coln
}
这将返回此结果:
Username | Child Col1 | Child Col2 | Child Col3 | .. |Child Coln
asdf 1 11 22 .. 33
asdf 2 22 33 .. 44
asdf 3 33 44 .. 55
qwer 4 44 55 .. 66
qwer 5 55 66 .. 77
qwer 6 66 77 .. 88
zxcv 7 77 88 .. 99
zxcv 8 88 99 .. 00
我想实现这个目标:
Username | IEnumerable<Child>
asdf | {{1 11 22 .. 33}
| {2 22 33 .. 44}
| {3 33 44 .. 55}}
qwer | {{4 44 55 .. 66}
| {5 55 66 .. 77}
| {6 66 77 .. 88}}
zxcv | {{7 77 88 .. 99}
{8 88 99 .. 00}}
我正在尝试按用户名对项目进行分组,并以Custom {UserID,IEnumerable}的形式生成自定义对象,我可以在完成后序列化对象。任何帮助表示赞赏。 编辑:关于数据结构,它不能改变,因为我连接到第三方系统,所以我正在处理给出的内容。
答案 0 :(得分:4)
我想也许你在这里寻找的是一个子查询。我会尝试这样的事情:
from parent in db.ParentTable
select new {
Username = parent.Username,
Children = (from child in db.ChildTable
where child.UserId == parent.UserId
select child)
}
如果您只想从groupby查询中填充列表而不进行循环,则可以执行以下操作:
List<ResultDataClass> returnData = dataResult.GroupBy(item => new KeyValuePair<int, string>(item.UserID, item.UserName), item => item)
.Select(rdc => var newdata = new ResultDataClass(userData.Key.Key, userData.Key.Value, userData.Select(item => item.TrackData))).ToList();
答案 1 :(得分:0)
虽然这不是一个理想的解决方案,但我决定在执行查询之后但在序列化数据之前对对象进行分组。我试图通过“&#39;条款,但我没有任何聚合要申请,因为我没有试图找到子项的最大值或总和,而是直接组。我的(未定义的)解决方案使用我的原始查询,但放入自定义实体类:
from parent in db.ParentTable
join child in db.ChildTable on new { Userid = parent.Id } equals new { Userid = child.Userid }
where
child.Col1 == Argument1 &&
child.Col2 == Argument2
select new ChildDataDomainModelClass {
Username = parent.Username,
child.Col1,
child.Col2,
child.Col3,
child.Coln
}
//I had grouped the object like this, where the object type returned on the grouping is of type IEnumerable<IGrouping<KeyValuePair<int, string>, ChildDataDomainModelClass>>:
List<ResultDataClass> returnData= new List<ResultDataClass>();
var groupedByUserName = dataResult.GroupBy(item => new KeyValuePair<int, string>(item.UserID, item.UserName), item => item);
foreach (var userData in groupedByUserName)
{
var newdata = new ResultDataClass(userData.Key.Key, userData.Key.Value, userData.Select(item => item.TrackData)); //TrackData is what I have named the Child Data that was returned
returnData.Add(newdata);
}
我非常感谢所提供的输入。如果有人对这个问题有一个更优雅的解决方案,我不必在创建自定义类之前循环遍历对象,请告诉我。理想情况下,我不必创建&#39; ChildDataDomainModelClass&#39;通过我的查询,我会选择新的&#39; ResultDataClass&#39;。我希望这会有助于遇到这个问题的其他人。如果我想出一个解决方案,我会相应地更新这篇文章。我感谢大家的意见。感谢。