public void TestContains() { Expression <Func <Sample, bool> > expected = t => t.StringValue.Contains("A"); Assert.Equal(expected.ToString(), Lambda.Contains <Sample>("StringValue", "A").ToString()); Expression <Func <Sample, bool> > expected2 = t => t.Test2.StringValue.Contains("A"); Assert.Equal(expected2.ToString(), Lambda.Contains <Sample>("Test2.StringValue", "A").ToString()); Expression <Func <Sample, bool> > expected3 = t => t.Test2.Test3.StringValue.Contains("A"); Assert.Equal(expected3.ToString(), Lambda.Contains <Sample>("Test2.Test3.StringValue", "A").ToString()); }
public void TestContains() { //一级属性 Expression <Func <Test1, bool> > expected = t => t.Name.Contains("A"); Assert.AreEqual(expected.ToString(), Lambda.Contains <Test1>("Name", "A").ToString()); //二级属性 Expression <Func <Test1, bool> > expected2 = t => t.A.Address.Contains("A"); Assert.AreEqual(expected2.ToString(), Lambda.Contains <Test1>("A.Address", "A").ToString()); //三级属性 Expression <Func <Test1, bool> > expected3 = t => t.A.B.Name.Contains("A"); Assert.AreEqual(expected3.ToString(), Lambda.Contains <Test1>("A.B.Name", "A").ToString()); }
/// <summary> /// 构建表达式树 /// 调用:GenerateExpression(new string[]{"username"},new object[]{"zzl"},new string[]{"="}); /// </summary> /// <typeparam name="T">表类型</typeparam> /// <param name="keys">字段名</param> /// <param name="values">字段值</param> /// <param name="operation">操作符</param> /// <returns></returns> public static Expression <Func <T, bool> > GenerateExpression <T>(List <FieldValueParam> listParam) { Expression <Func <T, bool> > expression_return = t => true; try { if (listParam.Count > 0) { foreach (var item in listParam) { switch (item.operation) { // 等于 case "=": expression_return = expression_return.And(Lambda.Equal <T>(item.name, item.value)); break; // 大于 case ">": expression_return = expression_return.And(Lambda.Greater <T>(item.name, item.value)); break; // 大于等于 case ">=": expression_return = expression_return.And(Lambda.GreaterEqual <T>(item.name, item.value)); break; // 小于 case "<": expression_return = expression_return.And(Lambda.Less <T>(item.name, item.value)); break; // 小于等于 case "<=": expression_return = expression_return.And(Lambda.LessEqual <T>(item.name, item.value)); break; // 包含 case "%": expression_return = expression_return.And(Lambda.Contains <T>(item.name, item.value)); break; // 包含于 case "in": string[] arrStr = item.value.ToString().Split(','); Expression <Func <T, bool> > or_return = t => false; if (arrStr.Length > 0) { foreach (var arr in arrStr) { or_return = or_return.Or(Lambda.Contains <T>(item.name, arr)); } } expression_return = expression_return.And(or_return); break; // 不等于 case "!=": expression_return = expression_return.And(Lambda.NotEqual <T>(item.name, item.value)); break; default: throw new ArgumentException("无效的操作符,目前只支持=,%,>,<,>=,<=,in"); } } } } catch (Exception ex) { throw ex; } return(expression_return); }