This question starts here: Dynamic LINQ to SharePoint and Projection
how to build dynamic LINQ to SharePoint expression like this(but store "Bill", "Sam" in array):
// Listing 1
// SPEntityModelDataContext generated with SPMetal
using (var db = new SPEntityModelDataContext("http://sharepoint/"))
{
var res = db.OrgUnitToUser
.Where(oo => (oo.User.Title == "Bill" || oo.User.Title == "Sam")
|| [any condition we want])
.ToList();
}
Using BuildOrExpressionEqual method we can finde all users with names stored in array:
// Listing 2
private static Expression<Func<TElement, bool>> BuildOrExpressionEqual<TElement, TValue>(Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values)
{
if (null == valueSelector)
throw new ArgumentNullException("valueSelector");
if (null == values)
throw new ArgumentNullException("values");
var p = valueSelector.Parameters.Single();
if (!values.Any())
return e => false;
var equals =
values.Select(value =>
(Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof(TValue))));
var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.Or(accumulate, equal));
return Expression.Lambda<Func<TElement, bool>>(body, p);
}
// usage
var names = new string[] {"Bill", "Sam"};
using (var db = new SPEntityModelDataContext("http://sharepoint/"))
{
var res = db.OrgUnitToUser
.Where(BuildOrExpressionEqual<OrgUnitToUserItem, string>(tt => tt.User.Title, names))
.ToList();
}
But how to add [any condition we want] (see Listing 1)?
ooto the function to check. – Kit Menke Feb 22 '12 at 01:01