Neben Nicholas Butler und den Hinweis in Kommentar von Matt (diese Verwendung T
für Art der Eingangsklasse), ich Nicholas eine Verbesserung setzen antworten Sie, dass die Eigenschaft der Entität dynamisch generiert wird und dass die Funktion duos field
nicht als Parameter senden muss.
Zur Verwendung hinzufügen Klasse als Schlag:
public static class Helpers
{
public static Func<T, T> DynamicSelectGenerator<T>(string Fields = "")
{
string[] EntityFields;
if (Fields == "")
// get Properties of the T
EntityFields = typeof(T).GetProperties().Select(propertyInfo => propertyInfo.Name).ToArray();
else
EntityFields = Fields.Split(',');
// input parameter "o"
var xParameter = Expression.Parameter(typeof(T), "o");
// new statement "new Data()"
var xNew = Expression.New(typeof(T));
// create initializers
var bindings = EntityFields.Select(o => o.Trim())
.Select(o =>
{
// property "Field1"
var mi = typeof(T).GetProperty(o);
// original value "o.Field1"
var xOriginal = Expression.Property(xParameter, mi);
// set value "Field1 = o.Field1"
return Expression.Bind(mi, xOriginal);
}
);
// initialization "new Data { Field1 = o.Field1, Field2 = o.Field2 }"
var xInit = Expression.MemberInit(xNew, bindings);
// expression "o => new Data { Field1 = o.Field1, Field2 = o.Field2 }"
var lambda = Expression.Lambda<Func<T, T>>(xInit, xParameter);
// compile to Func<Data, Data>
return lambda.Compile();
}
}
Die DynamicSelectGenerator
Methode Einheit mit Typ T
diese Methode hat optionale Eingabeparameter erhalten Fields
, dass, wenn Sie von Unternehmen Spezialgebiet slect wollen als String senden wie "Field1, Field2"
und wenn Sie etwas zu methid nicht senden, es alle Felder der Entität zurückgeben, können Sie diese Methode als unten verwenden:
using (AppDbContext db = new AppDbContext())
{
//select "Field1, Field2" from entity
var result = db.SampleEntity.Select(Helpers.DynamicSelectGenerator<SampleEntity>("Field1, Field2")).ToList();
//select all field from entity
var result1 = db.SampleEntity.Select(Helpers.DynamicSelectGenerator<SampleEntity>()).ToList();
}
(Angenommen, Sie einehabenmit Namen AppDbContext
und Rahmen hat eine Einheit mit dem Namen SampleEntity
)
Ja ist es, wenn Ihre Filtereingabe Zeichenfolge ist –
@CuongLe Wie? Jedes Codeprobe oder Link wäre großartig. – Unforgiven
Was soll der Typ von 'result' sein? –