Lambda 表达式本质上是一个匿名函数,是C#中一种特殊语法,它的引入,使得匿名方法更加简单易用,最直接的是在方法体内调用代码或者为委托传入方法体的形式与过程变得更加优雅。 使用Lambda表达式可大大减少代码量,使得代码更加的优美、简洁,更有可观性。由于Lambda表达式的便利性,因此虽然在整合多个接入实现比较麻烦一些,我依旧希望通过寻找方法实现对Lambda表达式的兼容处理。
例如,以下就是一个根据名称简单进行判断的Lambda表达式的处理。
/// <summary> /// 新增状态下的数据保存 /// </summary> /// <returns></returns> public async override Task<bool> SaveAddNew() { CustomerInfo info = tempInfo;//必须使用存在的局部变量,因为部分信息可能被附件使用 SetInfo(info); try { #region 新增数据 //检查是否还有其他相同关键字的记录 bool isExist = await BLLFactory<ICustomerService>.Instance.IsExistAsync(s=> s.Name.Equals(info.Name)); if (isExist) { MessageDxUtil.ShowTips("指定的【姓名】已经存在,不能重复添加,请修改"); return false; } var success = await BLLFactory<ICustomerService>.Instance.InsertAsync(info); if (success) { //可添加其他关联操作 return true; } #endregion } catch (Exception ex) { LogTextHelper.Error(ex); MessageDxUtil.ShowError(ex.Message); } return false; }
它的函数原型就是一个Lambda表达式,如下所示的定义
/// <summary> /// 判断是否存在指定条件的记录 /// </summary> /// <param name="input">表达式条件</param> /// <returns></returns> Task<bool> IsExistAsync(Expression<Func<TEntity, bool>> input);
有些稍微复杂一点的函数,如下定义所示。
/// <summary> /// 获取某字段数据字典列表 /// </summary> Task<List<string>> GetFieldList(Expression<Func<TEntity, object>> selector, Expression<Func<TEntity, bool>> where = null);
调用的时候,如下所示。
/// <summary> /// 初始化数据字典 /// </summary> private async void InitDictItem() { //初始化代码 var list = await BLLFactory<IFormService>.Instance.GetFieldList(s=> s.Category); this.txtCategory.BindDictItems(list, ""); }
不过简单是简单了,但是本身Lambda表达式不能直接传递给Web API端参数,因为它无法直接序列化进行传递。
我们在之前说过,接入两种不同的数据提供方式。
因此我们为了继续使用Lambda表达是的优点,就需要使用Serialize.Linq对Lambda表达式进行序列化和反序列化。这样就可以在Web API端和Web API 代理端对Lambda表达式进行正常的使用了。