实体框架 C# 中的反射

问题描述 投票:0回答:5

我正在尝试使用反射通过实体框架进行动态选择。

该方法将获取列名称、要搜索的每列的值以及每列的顺序作为参数。

例如:

 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
 }

可能吗?你能帮我吗?

c# entity-framework reflection entity
5个回答
7
投票

我也有同样的情况!花了3个小时找到了解决方案!

Expression.Lambda 和运行时查询生成,最简单的“Where”示例

与 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
投票

您不能只向 EF 发送涉及

GetType
等方法调用的“复杂查询”。 EF 必须向底层数据提供者提供表达式树。 有关支持功能的文档:
支持 Linq to 实体中的 Linq 方法。 Linq 到 EF

您可以准备动态查询,但您需要一点时间来准备。 LINQ 中的动态表达式和查询有 2 种基本方法。

a) 字符串动态 Lambda

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

-在这个领域另一个非常有用的工具是谓词生成器。

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


0
投票

最简单的方法是 EF Core 中的类似方法:

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

 item = context.Products.Where(e=> EF.Property<string>(e,ColumnName).Contains(Value)  ).ToList();

-1
投票

为什么不直接使用原始sql语句

 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

© www.soinside.com 2019 - 2024. All rights reserved.