如何根据id连接列值

时间:2014-02-05 19:05:08

标签: c# linq

我在C#中有一个这样的表来自数据集

COL1    COL2        COL3    COL4  COL5

1000    APPLE        50     92    TESTING     
1000    APPLE        50     92    ALPHA
1000    APPLE        50     92    BETA
1000    APPLE        50     92    OMEGA
2000    ORANGE       60     90    DELTA
2000    ORANGE       60     90    TEST
2000    ORANGE       60     90    SLEEP

我需要这样的结果

COL1    COL2        COL3    COL4  COL5

1000    APPLE        50     92    TESTINGAPHABETAOMEGA
2000    ORANGE       60     90    DELTASLEEPTEST

如何实现这一目标?

我在这一行之后敲定了

      var result = from row in dataTable.AsEnumerable()
                     group row by row.Field<int>("COL1") into grp
                     select new
                     {
                         COL1= grp.Key,
                         Count = grp.Count()
                     };

3 个答案:

答案 0 :(得分:0)

我不认为你可以用LINQ做到这一点,但是有一个小子程序对你有用。

var _rowlist = table.AsEnumerable().OrderBy(x => x.Field<Int32>("COL1")).ThenBy(x => x.Field<string>("COL2")).ThenBy(x => x.Field<string>("COL3")).ThenBy(x => x.Field<string>("COL4")).ToList();
            DataTable _newtable = table.Clone();
            string oldrowid = "";
            foreach (DataRow _indrow in _rowlist)
            {
                if (!oldrowid.Equals(_indrow["COL1"].ToString()))
                {
                    oldrowid = _indrow["COL1"].ToString();
                    DataRow _newrow = _newtable.NewRow();
                    _newrow["COL1"] = _indrow["COL1"].ToString();
                    _newrow["COL2"] = _indrow["COL2"].ToString();
                    _newrow["COL3"] = _indrow["COL3"].ToString();
                    _newrow["COL4"] = _indrow["COL4"].ToString();
                    _newrow["COL5"] = _indrow["COL5"].ToString();
                    _newtable.Rows.Add(_newrow);
                }
                else
                {
                    Int32 _id = Int32.Parse(_indrow["COL1"].ToString());
                    DataRow _row = _newtable.AsEnumerable().Where(a => a.Field<Int32>("COL1") == _id).SingleOrDefault();
                    int Index = _newtable.Rows.IndexOf(_row);
                    _row["COL5"] += "," + _indrow["COL5"].ToString();
                }
            }

//_newtable contains what you want

答案 1 :(得分:0)

var result = from row in dt.AsEnumerable()
             group row by row.Field<int>("COL1") into grp
             let firstCols = grp.First()
             let lastCells = string.Join("", grp.Select(x => x[4]).ToArray())
             select new object[] { firstCols[0], firstCols[1], firstCols[2], firstCols[3], lastCells };

var dtResult = dt.Clone();
foreach (var item in result )
{
    dtResult.Rows.Add(item);
}

答案 2 :(得分:0)

试试这个:

var result =
    from row in dataTable.AsEnumerable()
    let COL1 = row.Field<int>("COL1")
    let COL2 = row.Field<string>("COL2")
    let COL3 = row.Field<int>("COL3")
    let COL4 = row.Field<int>("COL4")
    let COL5 = row.Field<string>("COL5")
    group COL5 by new { COL1, COL2, COL3, COL4, } into grp
    select new
    {
        COL1 = grp.Key.COL1,
        COL2 = grp.Key.COL2,
        COL3 = grp.Key.COL3,
        COL4 = grp.Key.COL4,
        COL5 = String.Join("", grp),
    };