0

我有一个对象:

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)中。我看过几个例子,但没有任何效果......我错过了什么?

4

5 回答 5

3
  1. 不要用一个代表您的位置的值对新的匿名对象进行分组,只需在该位置上进行分组

  2. 不要选择一个新的匿名对象作为结果,选择你关心的对象

  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();
                };
于 2013-10-22T19:30:41.847 回答
0

更改您的选择子句。您也不需要使用匿名对象作为分组键,因为您只使用一个值作为键。

var grouped = from table in sqlResults.AsEnumerable()
              group table by table["LOCATION"] into groupby
              select new DataItem
              {
                  Location = groupby.Key,
                  PersonList = groupby.ToList()
              };
于 2013-10-22T19:28:59.100 回答
0

可能是这样的:

 select new DataItem
   {
     Location= groupby.Key,
     PersonList = groupby
   };

请注意,在这种情况下,您必须声明PersonListIEnumerable<string>

于 2013-10-22T19:29:50.840 回答
0

您只需要初始化 的新实例DataItem,即:

select new DataItem
          {
              Location = groupby.Key,
              PersonList = groupby.ToList()
          };

的想法select是为表达式的每次迭代选择/返回一个实例,因此您只需要指定要返回的内容。(仅使用时new,您实际上是在初始化一个新的匿名类型)。

于 2013-10-22T19:31:37.377 回答
0

由于在您的示例数据(DataItem 的?)中每个位置仅包含一个人,我质疑您的 DataItem 类上的 PersonList 属性是否真的应该只是一个人(或您的示例中的“字符串”)。看起来您正在查询人员列表及其位置,然后尝试按位置对这些结果进行分组并列出该位置的每个人。我认为您正在尝试创建类似 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 中。如果您只在方法范围内访问分组变量,则可以只使用推断类型。否则,其他答案之一是正确的。

于 2013-10-22T19:42:51.090 回答