Lamdba小技巧

一般,我们是这么查找的:

        List<Student> lstStu = new List<Student>();
        for (int i = 1; i < 10; i++)
        {
            Student stu = new Student();
            stu.ID = i;
            stu.Name = "k" + i;
            stu.stuNo = Guid.NewGuid();
           
            lstStu.Add(stu);
        }
        Student s = lstStu.Where(w => w.ID == 1).First();

如果不想在where里面写表达式,或者有时候查的未必是ID,想做个通用方法:

        List<Student> lstStu = new List<Student>();
        for (int i = 1; i < 10; i++)
        {
            Student stu = new Student();
            stu.ID = i;
            stu.Name = "k"+i;
            stu.stuNo = Guid.NewGuid();
            lstStu.Add(stu);
        }
        int id = 3;//属性名对应的值,类型必须与属性的类型相同
        string typeName = "ID";//要查找的属性名
        ParameterExpression parameterExpression = Expression.Parameter(typeof(Student));
        MemberExpression memberExpression = Expression.Property(parameterExpression, typeName);
        ConstantExpression constantExpression = Expression.Constant(id);
        Expression<Func<Student, bool>> a = Expression.Lambda<Func<Student, bool>>(
                Expression.Equal(memberExpression, constantExpression),
                parameterExpression);
        var k = lstStu.Where(a.Compile()).First();
        Console.WriteLine(k.Name);
        Console.ReadKey();

如此,只要传入要比较的类型名和对应值,就可以返回表达式了。
这个在制作entityframework仓储时,有一定作用:

public class SomeThing<T,keyType>
{
    public Expression<Func<T, bool>> test(string typeName,keyType kt)
    {
        ParameterExpression parameterExpression = Expression.Parameter(typeof(T));
        MemberExpression memberExpression = Expression.Property(parameterExpression, typeName);
        ConstantExpression constantExpression = Expression.Constant(kt);
        Expression<Func<T, bool>> a = Expression.Lambda<Func<T, bool>>(
                Expression.Equal(memberExpression, constantExpression),
                parameterExpression);

        return a;
    }

    public Expression<Func<T, bool>> test2(string typeName, object kt)
    {
        var parameter = Expression.Parameter(typeof(T));

        Expression<Func<T, bool>> a = Expression.Lambda<Func<T, bool>>(
                   Expression.Equal(Expression.Property(parameter, typeName), Expression.Constant(kt)),
                   parameter);
        return a;
    }
    
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一. Java基础部分.................................................
    wy_sure阅读 9,228评论 0 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,292评论 19 139
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 11,076评论 0 4
  • 我喜欢一切靠窗的位置 特别是坐公交车的时候 夜晚的城市很美 街道上的人很多 灯光绚烂 凉风习习 我希望没有终点站 ...
    林月小镇阅读 1,189评论 0 0
  • 你爱我,我爱你,但这还不够。 by:虎牙骑士 感情大概是世界上唯一已经不会天道酬勤的事情。 我觉得没有三观之间的志...
    虎牙骑士阅读 1,436评论 0 1