El código para este tipo de consultas sería algo así (y este es de los simples):
- 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>";
- }
Eso era hasta ahora... gracias a Camlex (y gracias a Luis por decírmelo), este código se puede escribir así:
- 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();
- ...
- }
Echaré de menos los métodos recursivos... me hacían sentir especial...
No hay comentarios:
Publicar un comentario