Платформа объекта.Include () со временем компиляции, проверяя?

Рассмотрите следующий код, который звонит против сгенерированного контекста данных EF:

var context = new DataContext();
var employees = context.Employees.Include("Department");

Если я меняю имя отношений Отдела затем, этот код собирается начать бросать ошибку периода выполнения. Так есть ли какой-либо способ назвать.Include () методом безопасным способом, таким образом, я получаю время компиляции, проверяя на все ссылаемые отношения?

9
задан Mike Chamberlain 27 May 2010 в 12:46
поделиться

1 ответ

Я сделал небольшое расширение ObjectQuery, которое выглядит примерно так

public static ObjectQuery<TEntity> Include<TEntity, TProperty>(this ObjectQuery<TEntity> query, Expression<Func<TEntity, TProperty>> expression) where TEntity : class
{
    string name = expression.GetPropertyName();
    return query.Include(name);
}

, которое также требует

public static class ExpressionExtensions
{
    public static string GetPropertyName<TObject, TProperty>(this Expression<Func<TObject, TProperty>> expression) where TObject : class
    {
        if (expression.Body.NodeType == ExpressionType.Call)
        {
            MethodCallExpression methodCallExpression = (MethodCallExpression)expression.Body;
            string name = ExpressionExtensions.GetPropertyName(methodCallExpression);
            return name.Substring(expression.Parameters[0].Name.Length + 1);
        }
        return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1);
    }

    private static string GetPropertyName(MethodCallExpression expression)
    {
        MethodCallExpression methodCallExpression = expression.Object as MethodCallExpression;
        if (methodCallExpression != null)
        {
            return GetPropertyName(methodCallExpression);
        }
        return expression.Object.ToString();
    }
}

, с которым вы можете сделать

var context = new DataContext();      
var employees = context.Employees.Include(e => e.Department);

, который будет проверяться во время компиляции. Если я правильно помню, этот метод не работает для отношений "многие ко многим", но он работает для таких вещей, как

var item = context.Employees.Include(e => e.Department.Manager);

Удачи вам

6
ответ дан 4 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: