The code for those queries would be something like this (and this is a simple one):
public List<string> GetSomeInfo(string fieldsToSearch, string contentTypesToSearch) { ... var queryval = string.Empty; if (contentTypesToSearch.IsNullOrEmpty()) queryval = string.Format("<Where>" + GenerateFieldsQuery(fieldsToSearch.Split(','), 0) + "</Where>", text); else queryval = string.Format("<Where><And>" + GenerateCTypesQuery(contentTypesToSearch.Split(','), 0) + GenerateFieldsQuery(fieldsToSearch.Split(','), 0) + "</And></Where>", text); var scope = "Scope=\"RecursiveAll\""; ... } private static string GenerateFieldsQuery(string[] fields, int index) { if (fields.Length == 0) return string.Empty; if (fields.Length == index + 1) return "<Contains><FieldRef Name='" + fields[index] + "' /><Value Type='Text'>{0}</Value></Contains>"; return "<Or><Contains><FieldRef Name='" + fields[index] + "' /><Value Type='Text'>{0}</Value></Contains>" + GenerateFieldsQuery(fields, ++index) + "</Or>"; } private static string GenerateCTypesQuery(string[] cTypes, int index) { if (cTypes.Length == 0) return string.Empty; if (cTypes.Length == index + 1) return "<Eq><FieldRef Name='ContentType' /><Value Type='Choice'>" + cTypes[index] + "</Value></Eq>"; return "<Or><Eq><FieldRef Name='ContentType' /><Value Type='Choice'>" + cTypes[index] + "</Value></Eq>" + GenerateCTypesQuery(cTypes, ++index) + "</Or>"; }
That was until now... Thanks to Camlex (and thanks to Luis for showing it to me), that code can be written like this:
public List<string> GetSomeInfo(string fieldsToSearch, string contentTypesToSearch) { ... var queryVal = string.Empty; var fieldExtensions = new List<Expression<Func<SPListItem, bool>>>(); var cTypeExtensions = new List<Expression<Func<SPListItem, bool>>>(); if (!contentTypesToSearch.IsNullOrEmpty()) { foreach (var cType in contentTypesToSearch.Split(',')) cTypeExtensions.Add(x => (string)x["ContentType"] == cType); } foreach (var field in fieldsToSearch.Split(',')) fieldExtensions.Add(x => ((string)x[field]).Contains(text)); var expressions = new List<Expression<Func<SPListItem, bool>>>(); expressions.Add(ExpressionsHelper.CombineOr(cTypeExtensions)); expressions.Add(ExpressionsHelper.CombineOr(fieldExtensions)); queryVal = Camlex.Query().WhereAll(expressions).ToString(); ... }
I'll miss the recursive methods though... they made me feel special...
No comments:
Post a Comment