Lambda Expression in C#

1、Expression

    Expression<Func<double, double>> exp = a => Math.Sin(a);

    委托类型Func<double, double>,它限定生成的表达式树是一个接受double,并返回double的一元Lambda函数

 <Func<double, double, double, double, double> 输入参数为4个double,返回一个double类型
  static void Main(string[] args)
    {
        Expression<Func<double, double, double, double, double>> myExp =
            (a, b, m, n) => m * a * a + n * b * b;

        var calc = new BinaryExpressionCalculator(myExp);
        Console.WriteLine(calc.Calculate(1, 2, 3, 4));
    }

2、在linq to sql中的使用

     LoadWith方法,输入类型为泛型T,输入参数为Expression,返回System.Linq.Expressions.LambdaExpression

     LoadsWith方法,接受LambdaExpression[],加载数据

  <Func<T, object> 输入泛型,返回object(因为返回类型未定,所以为object)
    public partial class Db   //为Db.dbml文件的partial class 
    {

        public static LambdaExpression LoadWith<T>(Expression<Func<T, object>> expression)
        {
            return expression;
        }
       
        public void LoadsWith(params LambdaExpression[] expressions)
        {
            var dlo = new DataLoadOptions();
            foreach (var expression in expressions)
            {
                dlo.LoadWith(expression);
            }
            LoadOptions = dlo;
        }

           public static Db Open(bool readOnly = false) {

      var db = new Db();

      if (readOnly) db.ObjectTrackingEnabled = false;

       return db;

    }
    }

MSDN上对LoadWith的解释是:通过使用 lambda 表达式检索与主目标相关的指定数据。 LoadWith可以用一个sql语句加载相关表的数据

例如Student表inner join Class表,这就是LoadWith的意义所在。

调用:

 using (var db = Db.Open()) {

        db.LoadsWith(
          Db.LoadWith<Project>(p => p.Client), 
          Db.LoadWith<Project>(p => p.Files)
        );

        var project = db.Projects.SingleOrDefault(p => p.Id == form.Id);
}

Exploring Lambda Expression in C#

Expression Tree上手指南

https://msdn.microsoft.com/en-us/library/bb397687.aspx

巧用Expression表达式 解决类似于sql中 select in 的查询(适合于中小型项目)

linq to sql

原文地址:https://www.cnblogs.com/xiaochun126/p/4708292.html