Методы расширения LINQ для ребенка - PullRequest
1 голос
/ 09 апреля 2010

Я создал расширение LINQ, как говорилось о здесь . Но, видимо, это не работает с запросами на ребенка. Как видно из кода ниже:

return (from p in repository.GetResources()
                where p.ResourceNames.Any(r => r.Name.WhereIn(arg => arg.Name, "PartialWord"))
                select p).ToList();

Что я хочу сделать, так это то, что ResourceNames является коллекцией EntityCollection, и мне нужно проверить, есть ли свойство «Имя» дочерних элементов, чтобы увидеть, содержат ли они слово «PartialWord».

Где работает так:

repository.GetResources().WhereIn({CODEHERE});

но при помещении на ребенка он не работает. Есть ли особый способ настроить мое расширение? Это ниже:

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.</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));
    } 
}

1 Ответ

2 голосов
/ 09 апреля 2010

Предполагается, ResourceName.Name является строкой:

Вам не нужно расширение для string версии .Contains() в L2E . (Вам нужно сделать только для версии списка в L2E v. 1). Вы должны быть в состоянии сделать:

return (from p in repository.GetResources()
        where p.ResourceNames.Any(r => r.Name.Contains("PartialWord"))
        select p).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...