将新字段混合到对象而不在LINQ查询中对其字段进行硬编码?

时间:2012-08-30 12:01:27

标签: c# .net 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,name和age字段的对象

问题出现了:

是否可以将对象转换为字段本身,而无需对字段名称进行明确的硬编码,如下所示:

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

通过这种方式,当我向员工添加新字段时,不需要更改选择新块,例如性别

这可能吗?

(好吧,这看起来像问题here ......无论如何,希望能在这里得到更好的答案)

3 个答案:

答案 0 :(得分:0)

这就是你想要的!

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

答案 1 :(得分:0)

为什么不简单地嵌入你的对象?

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

答案 2 :(得分: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; }    

你会自动在词典中找到它。可能你必须使用反射方法重载来获得你所需要的......