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#
https://msdn.microsoft.com/en-us/library/bb397687.aspx
巧用Expression表达式 解决类似于sql中 select in 的查询(适合于中小型项目)
。