Apabila senarai tidak diketahui, lajur khusus dalam pertanyaan Linq mungkin mencabar. Walau bagaimanapun, terdapat penyelesaian yang melibatkan ekspresi lambda yang diluluskan untuk dipilih.
Pertimbangkan kelas data berikut:
Untuk secara dinamik memilih lajur tertentu, anda boleh menggunakan kaedah CreatEnewStatement untuk membuat ekspresi Lambda secara dinamik:
<code class="language-csharp">public class Data { public string Field1 { get; set; } public string Field2 { get; set; } public string Field3 { get; set; } public string Field4 { get; set; } public string Field5 { get; set; } }</code>
Kaedah ini menggunakan senarai koma untuk memisahkan senarai sebagai rentetan, dan secara dinamik menghasilkan ungkapan lambda.
<code class="language-csharp">private Func<Data, Data> CreateNewStatement(string fields) { var xParameter = Expression.Parameter(typeof(Data), "o"); var xNew = Expression.New(typeof(Data)); var bindings = fields.Split(',') .Select(o => o.Trim()) .Select(o => { var mi = typeof(Data).GetProperty(o); var xOriginal = Expression.Property(xParameter, mi); return Expression.Bind(mi, xOriginal); }); var xInit = Expression.MemberInit(xNew, bindings); var lambda = Expression.Lambda<Func<Data, Data>>(xInit, xParameter); return lambda.Compile(); }</code>
maka anda boleh menggunakan kaedah CreateNewStatement untuk membuat ekspresi Lambda dan lulus untuk memilih:
Ini akan mengembalikan urutan dengan objek data yang diisi dalam medan yang ditentukan. Sila ambil perhatian bahawa teknologi ini sesuai untuk bidang yang tidak diketahui semasa menyusun. Sekiranya medan yang dipilih adalah statik, ekspresi lambda konvensional atau kaedah berasaskan refleks lebih cekap.
<code class="language-csharp">var result = list.Select(CreateNewStatement("Field1, Field2"));</code>
Atas ialah kandungan terperinci Bagaimanakah saya boleh memilih lajur secara dinamik dalam pertanyaan Linq?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!