我遇到一个问题,无法对列表进行分组,我进行了研究并尝试了不同的方法,但结果不是我想要的。我不确定自己做错了什么。
List<NewSomeGroup> newsomegourplist = new List<NewSomeGroup>();
var query = from c in _someRepository.Table
where c.isRead == false
group c by c.ReferenceId into grpdlist
orderby grpdlist.Key
select grpdlist;
foreach (var grpdlist in query)
{
NewSomeGroup somegroup = new NewSomeGroup();
List<Some> somelist = new List<Some>();
somegroup.ReferenceId = grpdlist.Key;
foreach (var item in grpdlist) // not in
{
somelist.Add(item);
}
somegroup.somecontainlist = somelist;
newsomegourplist.Add(somegroup);
}
最后somegroup
的{{1}}正确,但是ReferenceId
的对象为空。我非常确定它在数据库中有数据,我也尝试在localhost中进行调试,发现somecontainlist
没有添加//not in
。
数据结构
item
答案 0 :(得分:0)
A,您没有指定Table
,所以我必须从您的代码中提取规范:
输入是Table
行,其中每一行都是一个至少具有布尔属性IsRead
和属性ReferenceId
的对象。
此外,似乎每一行都类似于Some
。行不等于Some
,因为行具有属性IsRead
,而行Some
不具有此属性。
这可能是键入错误,或者行可能是来自Some
派生类的对象。由于您没有指定表,因此我假设后者。
表中的行不必是相同类型的对象,但是它们至少是从Some
您希望所有尚未读取的行都分组为具有相同ReferenceId
的行。您希望将每个组转换为一个NewSomeGroup
对象,其中ReferenceId
是组中元素的公用ReferenceId
,而SbNotificationList
是一个列表,其中每个元素包含组中行的Some
值。
我对方法语法更加熟悉(它具有更多功能),所以我的答案将是方法语法:
var result = myRepository.Table // from every row in the Table
.Where(row => !row.IsRead) // take only those that are not read
.GroupBy(row => row.ReferenceId) // make groups of rows with equal ReferenceId
.Select(group => new NewSomeGroup() // from every group make one NewSomeGroup object
{
ReferenceId = group.Key,
SbNotificationList = group // from the sequence of rows in the group
.Cast<Some>() // cast every row to a Some
.ToList(), // and put it in a list
})
.OrderBy(item => item.ReferenceId);
仅当您完全确定表中的每一行确实是Some
时,此方法才有效。
这是最有效的,因为您的行没有被复制;参考资料将放入您的最终结果中。换句话说:您的最终结果包含原始行。
但是,如果您更改SbNotificationList元素的属性值,则原始行将更改。
如果您不希望这样做,或者某些行不是Some
,则必须使用行中的值创建新的Some
对象:
.GroupBy(row => row.ReferenceId)
.Select(group => new NewSomeGroup()
{
ReferenceId = group.Key,
SbNotificationList = group // from the rows in the group make one list
.Select(row => new Some() // where every row becomes one Some object
{
Title = row.Title,
ProjectId = row.ProjectId,
...
CreateOnUtc = row.CreateOnUtc,
})
.ToList(),
})
.OrderBy(item => item.ReferenceId);
无论选择哪种方法,如果输入表为空或没有未读的行,则结果仍将是NewSomeGroup
对象的序列,但是此序列将为空(这有所不同)比null!)。
如果输入表中有一个或多个被读取的行,则结果将不会为空。结果中的每个NewSomeGroup
都会有一个非空的SbNotificationList
,其中包含Some
等于{{1}的ReferenceId的所有行的ReferenceId
值}对象。
很难说,最终结果中的任何NewSomeGroup
对象都没有空的NewSomeGroup
。您可以在此SbNotificationList
答案 1 :(得分:0)
您可以尝试以下代码:
somegroup.somecontainlist.AddRange(somelist);
或者您可以尝试以下操作:
somegroup.somecontainlist = new List<SomeDataType>(somelist);
或者如果您在Linq中使用C#3和.NET 3.5,则可以执行以下操作:
somegroup.somecontainlist = somelist.ToList();