var examples = from d in context.Examples where d.Specialty is TaxonomyFieldValue && ((TaxonomyFieldValue)d.Specialty).Label == "Value One" select d;
For multi valued Managed Metadata Columns, my first attempt was a bust. I tried the following expression, but received a compiler error, "An expression tree may not contain an anonymous method expression".
var examples = from d in context.Examples where ((TaxonomyFieldValueCollection)d.Specialty).Exists(delegate(TaxonomyFieldValue tfv){ return tfv.Label == "Value One"; }) != null select d;
The hint here from the compiler is that I can do this as long as I don't use an anonymous method. So I created a method to test for the term I wanted and changed my expression to call this method.
private static bool ContainsMetadataTerm(object o, string termLabel) { bool exists = false; if (o is TaxonomyFieldValueCollection) { TaxonomyFieldValueCollection tfvc = (TaxonomyFieldValueCollection)o; exists = tfvc.Exists(delegate(TaxonomyFieldValue tfv) { return tfv.Label == termLabel; }); } return exists; } var examples = from d in context.Examples where d.Specialty is TaxonomyFieldValueCollection && ContainsMetadataTerm(d.Specialty, "Value One") select d;
Now I can query specifically for list items that use specific terms. Keep in mind that this filtering does not happen until after the list items have been pulled down, so you may want to do some additional filtering to narrow the results so you don't run afoul of the new Throttling feature of SharePoint 2010.
Here was the CAML generated by the last LINQ query, which shows that the additional filtering for Term was done after the records were pulled.
0x0100 2147483647
No comments:
Post a Comment