从LINQ创建对象

时间:2013-10-22 19:25:55

标签: c# linq

我有一个对象:

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

5 个答案:

答案 0 :(得分:3)

  1. 请勿使用表示您所在位置的单个值对新的匿名对象进行分组,只需将该位置分组

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

  3. 在获取人员列表时从组中选择人名。


  4. 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中。如果您只访问方法范围内的分组变量,则可以使用推断类型。否则,其他答案之一是正确的。