我的数据库返回值如下所示:
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#class以上结果为实体:
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方法来实现此目的。
答案 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))
});