2012-08-30 29 views
1

我有一個簡單的LINQ查詢這裏:將新字段混合到對象中,而不用在LINQ查詢中對其字段進行硬編碼?

var Staffs = new[] 
{ 
    new { id = 1, name = "Jefferson", age = 42}, 
    new { id = 2, name = "Jacobson", age = 54}, 
    new { id = 3, name = "Zhang", age = 34} 
}; 

var payroll = new[] 
{ 
    new { pid = 1, wage = 5000}, 
    new { pid = 2, wage = 6500}, 
    new { pid = 3, wage = 6700} 
}; 

var q = from stf in Staffs 
     from pay in payroll 
     where stf.id == pay.pid 
     select new 
     { 
      stfObj = stf, 
      pay.pid, 
      pay.wage 
     }; 

這裏,stfObj將包含ID,姓名和年齡字段

這裏對象問題來了:

是否有可能轉該對象到田間地頭自己沒有明確的硬編碼的字段名稱如下:

select new 
{ 
    stf.id, 
    stf.name, 
    stf.age, 
    pay.pid, 
    pay.wage 
}; 

通過這種方式,將有當我向工作人員添加一個新字段時,無需更改選擇新塊,例如性別例如

這可能嗎?

(好吧,這看起來像的問題here ......反正,希望能夠得到這裏更好的答案)

+0

可能的重複[如何選擇所有字段加上LINQ中的一些新字段?](http://stackoverflow.com/questions/10036421/how-to-select-all-fields-plus-some-new-fields-in-linq) –

+2

你打算如何訪問未命名的字段? –

回答

0

這是你想要的!

select new 
{ 
sId=stfObj.id, 
sName=stfObj.name, 
sAge=stdObj.age, 
pId=pay.pid, 
pWage=pay.wage 
}; 
0

爲什麼不簡單地嵌入你的對象?

select new { 
    staff = stf, 
    pay = pay 
}; 
0

我不知道,你需要什麼。但你可以嘗試使用Dictionary<>。比方說,我們有一個類:

public class Test 
{ 
    public string Name { get; set; } 
    public string Desc { get; set; }  
} 

所以,你可以做到以下幾點:

List<Test> list = new List<Test> 
{ 
    new Test 
    { 
     Name = "Test 1", 
     Desc = "Desc 1" 
    } 
}; 
var temp = list.Select(t => 
       { 
        Dictionary<string, object> values = new Dictionary<string, object>(); 
        foreach (PropertyInfo pi in t.GetType().GetProperties()) 
         values[pi.Name] = pi.GetValue(t, null); 
        return values; 
       }) 
       .FirstOrDefault(); 
temp.ToList().ForEach(p => Console.WriteLine(string.Format("{0}:\t{1}", p.Key, p.Value))); 

因此,如果你添加屬性的Test類,比方說,像這樣的:

public bool Extra { get; set; }  

您會自動在字典中找到它。也許你將不得不使用反射方法重載,以得到你所需要的...

相關問題