2011-06-08 44 views
0

这是我的数据库表中的数据:这是我的业务对象阅读重复的数据行使用它们LINQ

enter image description here

public class Unit 
    { 
     public Unit() 
     { 
      MemberIdList = new List<String>(); 
     } 

     public String UnitType { get; set; } 
     public String UnitZoom { get; set; } 
     public String MemberZoom { get; set; } 

     public List<String> MemberIdList { get; set; } 
    } 

整个数据从数据库被提取并放入DataTable中。

现在到了转型的Linq ...

后,我返回一个列表与3个对象持此数据:

enter image description here

现在想我是怎么得到的数据为3业务对象... 这就是我想知道的方式。一个提示可能是不同的,并为的IEqualityComparer 3个属性... 只是一个假设...

UPDATE

问题更新:

请阅读注释代码:)

var groupedCollection = table.AsEnumerable() 
            .GroupBy(row => new 
            { 
             UType = row.Field<string>("UnitType"), 
             UZoom = row.Field<string>("UnitZoom"), 
             MZoom = row.Field<string>("MemberZoom"), 
             MOrder = row.Field<int>("MemberOrder"), 

//我不想让MemberOrder在组密钥中,但后来我用这个属性来命令它... });

  var unitCollection = groupedCollection 
           .Select(g => new Unit 
           { 
            UnitType = g.Key.UType, 
            UnitZoom = g.Key.UZoom, 
            MemberZoom = g.Key.MZoom,         
            MemberIdList = g.Select(r => r.Field<string>("MemberId")).OrderBy(b => g.Key.MOrder).ToList(), 
           }); 

      List<Unit> units = unitCollection.ToList(); 
+0

您应该将表分成两个以避免相同的行。比你可以直接使用Linq2Sql再次使用它并获得与业务对象相同的结构 – Magnus 2011-06-08 21:17:27

+0

不能在这里更改任何内容。它是这样的;-) – msfanboy 2011-06-08 21:25:32

回答

0

像这样的事情?

DataTable dt = ... 

var list = 
dt.AsEnumerable() 
.GroupBy(r => new 
{ 
    UType = r.Field<string>("UnitType"), 
    UZoom = r.Field<string>("UnitZoom"), 
    MZoom = r.Field<string>("MemberZoom") 
}) 
.Select(g => new Unit 
{ 
    UnitType = g.Key.UType, 
    UnitZoom = g.Key.UZoom, 
    MemberZoom = g.Key.MZoom , 
    MemberIdList = g.Select(r => r.Field<string>("MemberId")).Distinct().ToList() 
}) 
.ToList(); 

编辑:
调用.Distinct()不是绝对必要的。它可以避免重复的MemberIds,如果你可以拥有它们,但它确实取决于OP的需求。

EDIT2:
(根据最后一个问题更新)

你是接近的解决方案:

只是改变这一行我的代码:

MemberIdList = g.Select(r => r.Field<string>("MemberId")).ToList() 

到:

MemberIdList = g.Select(r => r.Field<string>("MemberId")).OrderBy(r => r.Field<int>("MOrder")).ToList() 
+0

工程太棒了!:) – msfanboy 2011-06-08 21:10:28

+0

@digEmAll不要认为'Distinct()'是需要的 – Magnus 2011-06-08 21:11:54

+0

btw.why你不同的MemberId?分组是可以理解的,但是我会更加区分这3个属性......但是它工作得很好;-) – msfanboy 2011-06-08 21:17:47

1

这是我会怎么做:

var values = TblMembers.ToList(); 

var lst = 
    (from m in values 
    group m by new { m.UnitType, m.UnitZoom, m.MemberZoom } into g 
    select new 
    { 
     g.Key.UnitType, 
     g.Key.UnitZoom, 
     g.Key.MemberZoom, 
     MemberIdList = g.Select (x => x.MemberID).ToList() 
    }).ToList(); 
0
var result = 
     from n in data 
     group n by new { n.UnitType, n.UnitZoom, n.MemberZoom } into g 
     select new Unit 
     { 
      UnitType = g.Key.UnitType, 
      UnitZoom = g.Key.UnitZoom, 
      MemberZoom = g.Key.MemberZoom , 
      MemberIdList = g.Select (r => r.MemberId).ToList() 
     };