1

我在这里有一个简单的 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
 };

这样,当我向 Staffs 添加一个新字段时,就不需要更改 select new 块,例如 Gender

那可能吗?

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

4

3 回答 3

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; }    

你会自动在字典中找到它。可能你必须使用反射方法重载才能得到你需要的东西......

于 2012-08-31T00:05:35.070 回答
0

这是你想要的吗!

select new
{
sId=stfObj.id,
sName=stfObj.name,
sAge=stdObj.age,
pId=pay.pid,
pWage=pay.wage
};
于 2012-08-30T12:12:58.137 回答
0

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

select new {
    staff = stf,
    pay = pay
};
于 2012-08-30T12:16:23.293 回答