I created a LINQ extension as talked about here. But apparently, it does not work with queries on the child. As seen in the code below:
return (from p in repository.GetResources()
where p.ResourceNames.Any(r => r.Name.WhereIn(arg => arg.Name, "PartialWord"))
select p).ToList();
What I want to accomplish is that ResourceNames is an EntityCollection, which I need to check if the property 'Name' of the children to see if they contain the word 'PartialWord'.
WhereIn works on like this:
repository.GetResources().WhereIn({CODEHERE});
but when placed on the child, it does not work. Is there a special way to set up my extension. This is it below:
public static class QueryableExtensions
{
private static Expression<Func<TElement, bool>> GetWhereInExpression<TElement, TValue>(Expression<Func<TElement, TValue>> propertySelector, IEnumerable<TValue> values)
{
ParameterExpression p = propertySelector.Parameters.Single();
if (!values.Any())
return e => false;
var equals = values.Select(value => (Expression)Expression.Equal(propertySelector.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);
}
/// <summary>
/// Return the element that the specified property's value is contained in the specifiec values
/// </summary>
/// <typeparam name="TElement">The type of the element.</typeparam>
/// <typeparam name="TValue">The type of the values.</typeparam>
/// <param name="source">The source.</param>
/// <param name="propertySelector">The property to be tested.</param>
/// <param name="values">The accepted values of the property.</param>
/// <returns>The accepted elements开发者_Go百科.</returns>
public static IQueryable<TElement> WhereIn<TElement, TValue>(this IQueryable<TElement> source, Expression<Func<TElement, TValue>> propertySelector, params TValue[] values)
{
return source.Where(GetWhereInExpression(propertySelector, values));
}
/// <summary>
/// Return the element that the specified property's value is contained in the specifiec values
/// </summary>
/// <typeparam name="TElement">The type of the element.</typeparam>
/// <typeparam name="TValue">The type of the values.</typeparam>
/// <param name="source">The source.</param>
/// <param name="propertySelector">The property to be tested.</param>
/// <param name="values">The accepted values of the property.</param>
/// <returns>The accepted elements.</returns>
public static IQueryable<TElement> WhereIn<TElement, TValue>(this IQueryable<TElement> source, Expression<Func<TElement, TValue>> propertySelector, IEnumerable<TValue> values)
{
return source.Where(GetWhereInExpression(propertySelector, values));
}
}
Presuming ResourceName.Name
is a string:
You don't need any extension for the string
version of .Contains()
in L2E. (You do need it for the list version in L2E v. 1 only). You should be able to do:
return (from p in repository.GetResources()
where p.ResourceNames.Any(r => r.Name.Contains("PartialWord"))
select p).ToList();
精彩评论