我有一个对象:
public class DataItem
{
public string Location
{
get;
set;
}
public List<string> PersonList
{
get;
set;
}
}
我从表中得到一些返回类似的结果:
Room1 John
Room1 Jim
Room1 Dawn
Room1 Bob
Room1 Katie
我有一些我写过的LINQ:
var grouped = from table in sqlResults.AsEnumerable()
group table by new { placeCol = table["LOCATION"] } into groupby
select new
{
Value = groupby.Key,
ColumnValues = groupby
};
我的结果分组......但我想把它放到我的对象(DataItem)中。我见过几个例子,但没有任何效果......我错过了什么?
答案 0 :(得分:3)
请勿使用表示您所在位置的单个值对新的匿名对象进行分组,只需将该位置分组
不要选择新的匿名对象作为结果,选择您关心的对象
在获取人员列表时从组中选择人名。
var grouped = from row in sqlResults.AsEnumerable()
group row by row.Field<string>("LOCATION") into groupby
select new DataItem()
{
Location = groupby.Key,
PersonList = groupby.Select(row =>
row.Field<string>("Person")).ToList();
};
答案 1 :(得分:0)
更改您的select子句。您也不需要使用匿名对象作为分组键,因为您只使用一个值作为键。
var grouped = from table in sqlResults.AsEnumerable()
group table by table["LOCATION"] into groupby
select new DataItem
{
Location = groupby.Key,
PersonList = groupby.ToList()
};
答案 2 :(得分:0)
可能是这样的:
select new DataItem
{
Location= groupby.Key,
PersonList = groupby
};
请注意,在这种情况下,您必须将PersonList
声明为IEnumerable<string>
答案 3 :(得分:0)
您只需要初始化DataItem
的新实例,即:
select new DataItem
{
Location = groupby.Key,
PersonList = groupby.ToList()
};
select
的想法是为表达式的每次迭代选择/返回一个实例,这样你只需要指定你想要返回的内容。 (仅使用new
时,您实际上正在初始化新的匿名类型。)
答案 4 :(得分:0)
因为在你的样本数据中(DataItem的?)在每个Location中只包含一个人,所以我在质疑你的DataItem类上的PersonList属性是否应该只是一个Person(或者你的例子中的“string”)。看起来您正在查询人员及其位置列表,然后尝试按位置对这些结果进行分组,并列出该位置中的每个人。我认为你正在尝试创建类似Lookup的东西。
看看这段代码。
public class DataItem
{
public string Location
{
get;
set;
}
public string Person
{
get;
set;
}
}
// omitted fetch of sqlResults
var grouped = sqlResults.AsEnumerable()
.ToLookup(
item => new
{
Location = item.Location
}),
item => new
{
Person = item.Person
});
或者您可能正在尝试将LINQ查询的结果填充到原始DataItem中。如果您只访问方法范围内的分组变量,则可以使用推断类型。否则,其他答案之一是正确的。