protected override Expression VisitMember(MemberExpression m) #endif { if (m.Expression != null && m.Expression.NodeType == ExpressionType.Parameter) { var fieldName = GetFieldName(m.Member); sb.Append(_isNotEqual ? string.Format("-{0}", fieldName) : fieldName); return(m); } if (m.Expression != null) { if (m.Expression.NodeType == ExpressionType.Constant) { var ce = (ConstantExpression)m.Expression; sb.Append(ce.Value); } else if (m.Expression.NodeType == ExpressionType.MemberAccess) { var ce = (MemberExpression)m.Expression; #if NET40 || NET35 || PORTABLE40 var joinAttr = Attribute.GetCustomAttribute(ce.Member, typeof(LinqToSolrForeignKeyAttribute), true) as LinqToSolrForeignKeyAttribute; #else var joinAttr = ce.Member.GetCustomAttribute <LinqToSolrForeignKeyAttribute>(); #endif if (joinAttr != null) { var fieldName = GetFieldName(m.Member); var topType = ce.Expression as ParameterExpression; if (topType != null) { var joiner = new LinqToSolrJoiner(ce.Member.Name, topType.Type); var joinstr = string.Format("!join from={0} to={1} fromIndex={2}", joiner.FieldKey, joiner.ForeignKey, _service.Configuration.GetIndex(joiner.PropertyRealType)); sb.Append("{" + joinstr + "}" + fieldName); } } } return(m); } throw new NotSupportedException(string.Format("The member '{0}' is not supported", m.Member.Name)); }
public static IQueryable <TSource> Include <TSource>(this IQueryable <TSource> enumerable, params string[] properties) #endif { if (properties.Any()) { var query = enumerable as LinqToSolrQueriable <TSource>; if (query == null) { throw new ArgumentException("'Include' must be invoked as SolrQueryable extension"); } var service = ((LinqToSolrProvider)query.Provider).Service; service.CurrentQuery = service.CurrentQuery ?? new LinqToSolrQuery(); foreach (var prop in properties) { var joiner = new LinqToSolrJoiner(prop, typeof(TSource)); service.CurrentQuery.JoinFields.Add(joiner); } } return(enumerable); }