Безопасность типов, получая имена столбцов сущностей Entity Framework - PullRequest
1 голос
/ 07 января 2011

В настоящее время я привязываюсь к элементу управления из-за кода.

Например:

            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();

В идеале я хотел бы получить имена свойств от EF. Другие ORM, как правило, предоставляют Enum все доступные имена свойств. Разве это не так с EF?

1 Ответ

1 голос
/ 07 января 2011

Независимо от того, имеет ли ORM это встроенную функцию, вы можете сделать это самостоятельно как метод расширения, используя отражение.

Вот это в 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

Такэто даст вам что-то вроде:

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

(я использую source.First (), поскольку метод расширения находится на экземпляре класса, а не на коллекции экземпляров)

И я отмечаю, что ваш оригинальный пост находится в C #:

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

И

myControl.DataSource = source;
myControl.DataTextField = source.First().PropertyName(x => x.SomeColumn1);
myControl.DataValueField = source.First().PropertyName(x => x.SomeColumn2);
myControl.DataBind();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...