4

我正在尝试使用涉及父/子关系 (1:n) 的表的选择语句来生成自定义实体。我尝试对选定的对象进行分组,但在想出解决方案时遇到了麻烦。

我的数据将是这种格式:

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 } 的形式生成一个自定义对象,一旦完成,我就可以在其中序列化对象。任何帮助表示赞赏。编辑:关于数据结构,由于我正在连接到第 3 方系统,因此无法更改它,因此我正在使用给定的内容。

4

2 回答 2

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();
于 2013-01-31T02:30:18.713 回答
0

虽然这不是一个理想的解决方案,但我决定在执行查询之后、但在序列化数据之前对对象进行分组。我尝试应用 'group by' 子句,但我没有任何聚合可应用,因为我没有尝试找到子项的最大值或总和,而是直接组。我的(未优化的)解决方案看起来像这样,使用我的原始查询,但放置在自定义实体类中:

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);
        }

我很欣赏所提供的意见。如果有人对此问题有更优雅的解决方案,我不必在创建自定义类之前遍历对象,请告诉我。理想情况下,我不必创建“ChildDataDomainModelClass”,通过我的查询,我会选择新的“ResultDataClass”。我希望这会帮助其他遇到此问题的人。如果我想出一个解决方案,我会相应地更新这篇文章。我感谢大家的意见。谢谢。

于 2014-08-14T22:53:20.327 回答