实体框架c#中的反射
本文关键字:反射 框架 实体 | 更新日期: 2023-09-27 18:13:22
我正在尝试使用反射来通过实体框架进行动态选择。
该方法将获取列名、要搜索的每一列的值和每一列的顺序作为参数。
例如: 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
}
有可能吗?你能帮我吗?
我也有同样的事情!花了3个小时就找到了解决方案!
表达式。运行时生成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 order
是和否
如果你先执行项目到IEnumerable<T>
,那么你可以使反射工作,否则你不能有反射成为sql查询,除非你建立一个表达式。
但是你不必重新发明轮子,有人已经为你做了,只要使用动态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);
}
您不能仅仅发送涉及GetType
等方法调用的"复杂查询"到EF。EF必须向底层数据提供程序提供表达式树。支持特性的文档:
Linq对实体中支持的Linq方法。链接到EF
你可以准备动态查询,但是你需要一点时间来准备。在LINQ中有两种基本的动态表达式和查询方法。
a) String Dynamic Lambda
来。动态可以在以下链接中找到
http://msdn.microsoft.com/en-US/vstudio/bb894665.aspxhttp://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspxhttp://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为什么不直接使用原始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