2012-11-20 105 views
-1

我有一個表類似如下列表:使用LINQ來填充類

Data { 
    id varchar(50), 
    pId uniqueidentifier , 
    fId uniqueidentifier , 
    xid uniqueidentifier, 
    flag smallint 
} 

表包含了很多,因爲PID和FID重複行的是1:N的關係和FID到XID是1 :也有關係。

我想查詢該表並填充OBJ如下:

class P 
{ 
    Guid id; 
    List<F> fList; 
} 

class F 
{ 
    Guid id; 
    List<X> xList; 
} 


class X 
{ 
    Guid id; 
    byte flag; 
} 

我學習的LINQ。使用Linq從表中填充類P的任何解決方案都會很有幫助。

謝謝!

+2

你真的不應該問一個yes或no的問題的所有行。你的問題的答案很簡單,「是」,我認爲這對你不會有幫助。另外,你有什麼嘗試?你自己實施解決方案遇到了哪些問題? – Servy

回答

2

這個查詢將返回IEnumerable<P>(不知道轉換smallintboolean但其他的東西應該工作)

var query = from p in context.Data 
      group p by p.pId into gp 
      select new P() 
      { 
       id = gp.Key, 
       fList = (from f in gp 
         group f by f.fId into gf 
         select new F() 
         { 
          id = gf.Key, 
          xList = gf.Select(x => new X() { id = x.xid, 
                   flag = x.flag }) 
             .ToList() 
         }).ToList() 
      }; 

評論:

gp將包含對應於一些PID的所有行,換句話說 - 它返回所有與pId相關的fId。

gf將包含來自先前的結果,其涉及到一些FID(即與FID所有的Xid)

+0

謝謝!正是我在找什麼。我會在時限後接受答案。 – Chi

+1

@Chai welcome :)我也爲你添加了一些解釋 –

+0

@Chai如果F也有標誌,那麼標誌會被複制很多次,你不能確定所有的標誌值是否相同,所以我會去分組通過組合鍵。將新的{f.fId,f.flag}分組到這個'group f到gf'中,並在創建新的F對象時:'id = gf.Key.fId,flag = gf.Key.flag' –