[c#]使用 linq 使用反射和 lambda 表达式

标签: Linq .Net C#
发布时间: 2017/2/26 3:06:33
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我需要按验证命名为标志的值筛选项的集合deletion_date

 public List<T> GetAll()
 {
   if (context == null) context = new ajtdevEntities();
   return context.Set<T>().Where(p => p.GetType().GetProperty("deletion_date") == null).ToList();
 }

我会得到一个异常,当此泛型的方法

LINQ 到实体不能识别的方法 ' System.Reflection.PropertyInfo 替代 (System.String)',和后者可以不会转换成术语库。

如何解决这种方法?

解决方法 1:

而不是反射,您可以构建使用手动筛选器表达式 System.Linq.Expressions 像这样︰

public List<T> GetAll<T>()
{
    var parameter = Expression.Parameter(typeof(T), "p");
    var predicate = Expression.Lambda<Func<T, bool>>(
        Expression.Equal(Expression.PropertyOrField(parameter, "deletion_date"), Expression.Constant(null)),
        parameter);
    if (context == null) context = new ajtdevEntities();
    return context.Set<T>().Where(predicate).ToList();
}

请注意,上述情况将会抛出异常是否您的类型并没有被称为"deletion_date"属性/字段或属性的类型不支持 null 。但同样可以说您基于反射执行 (如果它的工作)。

官方微信
官方QQ群
31647020