Отражение в Entity Framework C #

1

Я пытаюсь использовать отражение, чтобы сделать динамический выбор через Entity Framework.

Идея заключается в том, что метод получит в качестве параметров имя столбца, значение для каждого столбца для поиска и порядок каждого столбца.

Например:

 public anEntity list(String ColumnName, String Value, String Order)
 {
    //
    //...
    items = (from r in context.Products
             where r.GetType().GetProperty(ColumnName). Contains(Value)))
             select r).OrderBy(Order).ToList();
    returns Items
 }

Является ли это возможным? Не могли бы вы помочь мне?

  • 0
    Вы должны построить дерево выражений.
Теги:
reflection
entity-framework
entity

4 ответа

-2
Лучший ответ

У меня было то же самое! Отработал 3 часа и нашел решение!

Expression.Lambda и генерация запросов во время выполнения, самый простой пример "Где"

Это очень хорошая работа с EF, Expression> и LinqKit.

Изменить код для использования динамических типов:

private Expression<Func<Goods, bool>> LambdaConstructor (string propertyName, string inputText, Condition condition)
    {

            var item = Expression.Parameter(typeof(Goods), "item");
            var prop = Expression.Property(item, propertyName);
            var propertyInfo = typeof(Goods).GetProperty(propertyName);
            var value = Expression.Constant(Convert.ChangeType(inputText, propertyInfo.PropertyType));
            BinaryExpression equal;
            switch (condition)
            {
                case Condition.eq:
                    equal = Expression.Equal(prop, value);
                    break;
                case Condition.gt:
                    equal = Expression.GreaterThan(prop, value);
                    break;
                case Condition.gte:
                    equal = Expression.GreaterThanOrEqual(prop, value);
                    break;
                case Condition.lt:
                    equal = Expression.LessThan(prop, value);
                    break;
                case Condition.lte:
                    equal = Expression.LessThanOrEqual(prop, value);
                    break;
                default:
                    equal = Expression.Equal(prop, value);
                    break;
            }
            var lambda = Expression.Lambda<Func<Goods, bool>>(equal, item);
            return lambda;
        }

И для OrderBy с использованием: Невозможно отсортировать имя свойства в LINQ OrderBy

1

Да и нет.

Если вы сначала выполняете элементы в IEnumerable<T> вы можете сделать работу отражения, иначе вы не сможете отразить, чтобы стать SQL-запросом, если только вы не создаете выражение.

Но вам не нужно изобретать колесо, кто-то уже построил его для вас, просто используйте Dynamic Linq

public IQueryable<T> List<T>(string columnName, string value, string order)
   where T : class
{
    return context.Set<T>().Where(columnName + " = @0", value).OrderBy(order);
}
0

почему бы не просто использовать raw sql statement

 public anEntity list(String ColumnName, String Value, String Order)
 {
      var items= context.Database.SqlQuery<anEntity>("select * from "+Products +" where "+ ColumnName +"like '%"+ Value +"%' order by "+ Order);

     returns items;
 }

больше информации здесь:

http://www.entityframeworktutorial.net/EntityFramework4.3/raw-sql-query-in-entity-framework.aspx

0

Вы не можете просто отправлять "сложные запросы", которые включают такие вызовы методов, как GetType для EF. EF должен предоставить дерево выражений базовому поставщику данных. Документ о поддерживаемых функциях:
Поддерживаемые методы Linq в Linq для объектов. Linq to EF

Вы можете подготовить динамические запросы, но вам потребуется немного времени, чтобы подготовить это. Существует два основных подхода к динамическим выражениям и запросам в LINQ.

a) Строковая динамическая лямбда

System.Linq.Dynamic можно найти по следующим ссылкам:
http://msdn.microsoft.com/en-US/vstudio/bb894665.aspx http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the -linq-dynamic-query-library.aspx http://www.scottgu.com/blogposts/dynquery/dynamiclinqcsharp.zip

b) Строить деревья выражений

Более мощный, но сложнее освоить... Создайте выражения деревьев с кодом, найденным здесь: http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx

Инструмент -ANother, который очень полезен в этом пространстве, является построителем предикатов.

http://www.albahari.com/nutshell/predicatebuilder.aspx

Ещё вопросы

Сообщество Overcoder
Наверх
Меню