private string Contains(string methodName, MethodCallExpression mce, bool isTure)
{
MemberType leftType = MemberType.None;
MemberType rightType = MemberType.None;
var left = CreateSqlElements(mce.Object, ref leftType,true);
var right = mce.Arguments[0].NodeType.IsIn(ExpressionType.Constant, ExpressionType.MemberAccess) ? CreateSqlElements(mce.Arguments[0], ref rightType, true) : Expression.Lambda(mce.Arguments[0]).Compile().DynamicInvoke().ObjToString();
if (left.IsCollectionsList() || right.IsStringArray() || right.IsEnumerable())
{
object containsValue = null;
string fieldName = "";
if (left.IsCollectionsList())
{
fieldName = right;
MemberExpression mbx = ((MemberExpression)mce.Object);
Expression exp = mce.Object;
SetMemberValueToDynInv(ref exp, mbx, ref containsValue);
}
else
{
MemberExpression mbx = ((MemberExpression)mce.Arguments[0]);
Expression exp = mce.Arguments[0];
SetMemberValueToDynInv(ref exp, mbx, ref containsValue);
fieldName = CreateSqlElements(mce.Arguments[1], ref rightType,true);
}
List<string> inArray = new List<string>();
foreach (var item in (IEnumerable)containsValue)
{
inArray.Add(item.ObjToString());
}
if (inArray.Count == 0)
{
return (" (1=2) ");
}
var inValue = inArray.ToArray().ToJoinSqlInVal();
return string.Format("({0} IN ({1}))", fieldName.GetTranslationSqlName(), inValue);
}
else if (mce.Arguments.Count == 2) { //两个值
//object containsValue = null;
//MemberExpression mbx = ((MemberExpression)mce.Arguments[0]);
//Expression exp = mce.Arguments[0];
//SetMemberValueToDynInv(ref exp, mbx, ref containsValue);
//var fieldName = CreateSqlElements(mce.Arguments[1], ref rightType);
//return null;
throw new SqlSugarException("请将数组提取成变量,不能直接写在表达式中。");
}
else
{
Check.Exception(leftType == MemberType.Value, string.Format(ExpMethodError, methodName));
var oldLeft = AddParas(ref left, '%' + right + '%');
return string.Format("({0} {1} LIKE " + SqlSugarTool.ParSymbol + "{2})", oldLeft.GetTranslationSqlName(), null, left);
}
}