2011-01-07 12 views
1

Ich bin derzeit an ein Steuerelement von code-behind gebunden.Typesafeing durch Abrufen der Entitätsspaltennamen von Entity Framework

Zum Beispiel:

  var ctx = new MyEntities(); 
      var source = from o in ctx.Users 
         select o; 

      myControl.DataSource = source; 
      myControl.DataTextField = "SomeColumn1"; // Can I not typesafe this? 
      myControl.DataValueField = "Somecolumn2"; 
      myControl.DataBind(); 

Im Idealfall würde Ich mag die Eigenschaftsnamen von EF zu erhalten. Andere ORMs neigen dazu, ein Enum mit allen verfügbaren Eigenschaftsnamen zu versehen. Ist das bei EF nicht der Fall?

+0

Könnte ein Re-Tag wert sein, ist Frage nicht streng über EF? – RichardW1001

Antwort

1

Ob das ORM dies als eingebaute Funktion hat oder nicht, können Sie dies selbst als eine Erweiterungsmethode mit Reflektion tun.

Hier ist es in VB:

<Extension()> 
    Public Function PropertyName(Of T, TProperty)(ByVal targetObject As T, ByVal expression As Expression(Of Func(Of T, TProperty))) As String 
     Return DirectCast(expression.Body, Expressions.MemberExpression).Member.Name 
    End Function 

diese So würden Sie so etwas wie:

myControl.DataSource = source 
myControl.DataTextField = source.First().PropertyName(Function(x) x.SomeColumn1) 
myControl.DataValueField = source.First().PropertyName(Function(x) x.SomeColumn2) 
myControl.DataBind() 

(Ich verwende source.First(), weil die Erweiterung Methode auf einer Instanz ist nicht eine Sammlung von Instanzen der Klasse,)

Und ich nehme Ihren ursprünglichen Beitrag ist in C#:

[Extension()] 
public string PropertyName<T, TProperty>(T targetObject, Expression<Func<T, TProperty>> expression) 
{ 
    return ((Expressions.MemberExpression)expression.Body).Member.Name; 
} 

Und

myControl.DataSource = source; 
myControl.DataTextField = source.First().PropertyName(x => x.SomeColumn1); 
myControl.DataValueField = source.First().PropertyName(x => x.SomeColumn2); 
myControl.DataBind(); 
+0

Danke Richard! – DaveHogan

Verwandte Themen