示例#1
0
        private bool HandleEqualsNotEquals(BinaryExpression equalityExpression)
        {
            ConstantExpression constantExpression = ExtractConstantExpression(equalityExpression);

            if (constantExpression == null)
            {
                return(false);
            }
            Expression variableExpression = equalityExpression.Left.Equals(constantExpression)
                                                ? equalityExpression.Right
                                                : equalityExpression.Left;
            var variablePropertyHint = GetPropertyHint(variableExpression);
            var variableIsAddress    = variablePropertyHint != null &&
                                       (variablePropertyHint.MappingType == PropertyMappingType.Address ||
                                        variablePropertyHint.MappingType == PropertyMappingType.Id);
            var value    = constantExpression.Value;
            var defValue = variableExpression.Type.GetDefaultValue();

            if ((value == null && defValue == null) || (value != null && value.Equals(defValue)))
            {
                if (variableIsAddress)
                {
                    var querySourceReferenceExpression =
                        ((MemberExpression)variableExpression).Expression as QuerySourceReferenceExpression;
                    var varname = querySourceReferenceExpression.ReferencedQuerySource.ItemName;

                    var filter = equalityExpression.NodeType == ExpressionType.NotEqual
                                     ? "( bound(?{0}))"
                                     : "(!bound(?{0}))";
                    _filterWriter.AppendFormat(filter, varname);
                    return(true);
                }
                else
                {
                    string varname = null;
                    QueryBuilder.StartOptional();
                    var convertedExpression = VisitExpression(variableExpression);
                    QueryBuilder.EndOptional();
                    if (convertedExpression is SelectVariableNameExpression)
                    {
                        varname = (convertedExpression as SelectVariableNameExpression).Name;
                    }
                    if (varname != null)
                    {
                        string filter;
                        if (variableExpression.Type.IsValueType && defValue != null)
                        {
                            filter = equalityExpression.NodeType == ExpressionType.NotEqual
                                         ? "(bound(?{0}) && (?{0} != {1}))"
                                         : "(!bound(?{0}) || (?{0} = {1}))";
                        }
                        else
                        {
                            filter = equalityExpression.NodeType == ExpressionType.NotEqual
                                         ? "( bound(?{0}))"
                                         : "(!bound(?{0}))";
                        }
                        if (defValue != null)
                        {
                            _filterWriter.AppendFormat(filter, varname,
                                                       _filterWriter.MakeSparqlConstant(defValue));
                        }
                        else
                        {
                            _filterWriter.AppendFormat(filter, varname);
                        }
                        return(true);
                    }
                }
            }
            if (variableIsAddress && value != null)
            {
                var querySourceReferenceExpression = ((MemberExpression)variableExpression).Expression as QuerySourceReferenceExpression;
                var varname = querySourceReferenceExpression.ReferencedQuerySource.ItemName;

                var filter = equalityExpression.NodeType == ExpressionType.Equal
                                 ? "( sameTerm(?{0}, <{1}>))"
                                 : "(!sameTerm(?{0}, <{1}>))";

                _filterWriter.AppendFormat(filter, varname, MakeResourceAddress(GetPropertyInfo(constantExpression), value.ToString()));
                return(true);
            }

            return(false);
        }