将List <t>的一个属性转换为逗号分隔的项</t>

时间:2014-03-06 09:22:53

标签: c# sql collections

我的数据库返回值如下所示:

A       B   C D
TES     T   1 ARD       
TES     T   1 BLK       
TES     T   1 FLE       
TES     T   1 HEN       
TES     T   1 RIV       

我必须改变它,如下所示:

TES     T   1 ARD,RIV,BLK,FLE,HEN,RIV

使用c#。

c#c​​lass以上结果为实体:

public class Entity
{
   public string A{get; set;}
   public string B{get; set;}
   public string C{get; set;}
   public string D{get; set;}
}

由于我使用多个数据库服务器,如ms sql,oracle,我的sql我不喜欢为每个编写查询。例如:在MS SQL中我必须填充并使用xml方法来实现此目的。

2 个答案:

答案 0 :(得分:2)

按组合键{ A, B, C }对实体进行分组,然后从组中的所有项创建连续的D值:

var result = from e in entities // where entities is in-memory list
             group e by new { e.A, e.B, e.C } into g
             select new Entity {
                A = g.Key.A,
                B = g.Key.B,
                C = g.Key.C,
                D = String.Join(",", g.Select(e => e.D))
             };

您可以通过调用db.Entities.AsEnumerable()将查询执行移至内存。当然,这需要将所有表数据从数据库下载到客户端。但是如果你要在服务器端进行分组,那么你将有N + 1个查询,其中N是组的数量。第一个查询将返回分组键的不同值。进一步的查询将按给定的组密钥值选择所需的字段。

答案 1 :(得分:0)

所以你想按前三列分组并用逗号分隔第四列?

我不确定这是否适用于您的LINQ提供程序,但它适用于LINQ-To-Objects:

var query = db.Entity
    .GroupBy(x => new { x.A, x.B, x.C })
    .Select(g => new Entity { 
        A = g.Key.A, B = g.Key.B, C = g.Key.C,
        D = String.Join(",", g.Select(x => x.D))
    });