2016-10-13 5 views
0

существует хорошая база данных под названием LiteDB. Я считаю неудобным отсутствие атрибутов для указания типа отношения (значение/ссылка) между объектами, хотя LiteDB обеспечивает свободный интерфейс для жесткого кодирования (подробности: https://github.com/mbdavid/LiteDB/wiki/DbRef). Я ленивый парень и не хочу всегда обновлять эти жестко закодированные отношения, чтобы следить за изменениями в моей модели данных. Поэтому я решил реализовать обнаружение во время выполнения объектов модели данных со свойствами, присвоенными DbRef (мой пользовательский атрибут). К сожалению, я застрял немного с созданиемСоздать выражение <Func<T,K>> in .Net Runtime

Expression<Func<T,K>> 

во время выполнения .Net ... для обеспечения его в следующем вызове (первый параметр):

BsonMapper.Global.Entity<Order>().DbRef(x => x.Customer, "customers"); 

Типы T и K приведены во время выполнения в качестве экземпляров System.Type (здесь в примере: T-Order, K - Customer).

Я очень признателен, если вы, ребята, дайте мне несколько советов о том, как создать экземпляр

Expression<Func<T,K>> 

в среде .NET для того, чтобы обеспечить его функцию ... DbRef (...).

+0

У нас есть имя свойства (например, 'Customer')? –

+0

Да, у нас есть название свойства. – Evgeny

+0

Почему вопрос нисходящий: (?) Это слишком расплывчато? – Evgeny

ответ

1

Ну, у вас есть тип объекта T, свойство типа K и имя свойства. Для того, чтобы построить Expression<Func<T, K>> вы могли бы просто использовать Expression.Parameter, Expression.Property и Expression.Lambda методы, как это:

var parameter = Expression.Parameter(typeof(T), "x"); 
var body = Expression.Property(parameter, propertyName); 
var selector = Expression.Lambda(body, parameter); 
+0

Уважаемый Иван, спасибо большое, ваше решение разрешило проблему! – Evgeny

+0

Просто для полноты, «» может быть просто опущен – Evgeny

+0

Но тогда результат будет просто «LambdaExpression». Я подумал об ошибке, чтобы получить выражение «Expression >», это действительно должно быть выражение Expression.Lambda > (...). Спасибо за примечание! –

-1

От вас вопрос. Позвольте мне отправить скриншот к вам, может быть, это может дать вам подсказку Expression> Example

public IEnumerable<TEntity> Fetch(Expression<Func<TEntity, bool>> predicate, Func<IQueryable<TEntity>, 
     IOrderedQueryable<TEntity>> orderBy =null, int? page = null, int? pageSize = null) 
    { 
     IQueryable<TEntity> query = _dbSet; 

     if (orderBy != null) 
     { 
      query = orderBy(query); 
     } 
     if (predicate != null) 
     { 
      query = query.AsExpandable().Where(predicate); 
     } 
     if (page != null && pageSize != null) 
     { 
      query = query.Skip((page.Value - 1) * pageSize.Value).Take(pageSize.Value); 
     } 
     return query; 
    } 

Я надеюсь, что это поможет

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответы только на ссылку могут стать недействительными, если измененная страница - [Из обзора] (/ review/low-quality-posts/13975275) – BWA

+0

Спасибо. Я только что редактировал сообщение – Fehintola

 Смежные вопросы

  • Нет связанных вопросов^_^