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

このようにして、たとえば性別などの新しいフィールドをスタッフに追加するときに、select new ブロックを変更する必要はありません。

それは可能ですか?

(わかりました、これはここの質問のように見えます...とにかく、ここでより良い答えを得ることを望んでいます)

4

3 に答える 3

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

何のためにこれが必要なのかわかりません。しかし、これを使用してみることができます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 {
    staff = stf,
    pay = pay
};
于 2012-08-30T12:16:23.293 に答える