LINQ к объектам - Здание, где пункты для тестирования наборов во многих многим отношения

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

18
задан Community 23 May 2017 в 12:34
поделиться

6 ответов

После чтения о PredicateBuilder, чтение всех замечательных сообщений, что люди, отправленные мне, отправляя на других сайтах, и затем читая больше на Объединяющиеся Предикаты и Каноническая Функция, Отображающаяся .. о, и я взял немного от Вызывающие функции в запросах LINQ (некоторые из этих уроков посещались от этих страниц).

у меня НАКОНЕЦ есть решение!!! Хотя существует часть, которая немного взламывается...

Позволяют нам закончить взломанную часть :(

я должен был использовать отражатель и скопировать класс ExpressionVisitor, который отмечен как внутренний. Я затем должен был внести некоторые незначительные изменения в него, чтобы заставить его работать. Я должен был создать два исключения (потому что это были newing внутренние исключительные ситуации. Я также должен был изменить ReadOnlyCollection () возврат метода из:

return sequence.ToReadOnlyCollection<Expression>();

К:

return sequence.AsReadOnly();

я отправил бы класс, но это является довольно большим, и я не хочу создавать помехи этому сообщению больше, чем это уже будет. Я надеюсь, что в будущем, что класс может быть удален из моей библиотеки и что Microsoft обнародует его. Хождение дальше...

я добавил класс ParameterRebinder:

public class ParameterRebinder : ExpressionVisitor {
        private readonly Dictionary<ParameterExpression, ParameterExpression> map;

        public ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map) {
            this.map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();
        }

        public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp) {
            return new ParameterRebinder(map).Visit(exp);
        }

        internal override Expression VisitParameter(ParameterExpression p) {
            ParameterExpression replacement;
            if (map.TryGetValue(p, out replacement)) {
                p = replacement;
            }
            return base.VisitParameter(p);
        }
    }

Затем я добавил класс ExpressionExtensions:

public static class ExpressionExtensions {
        public static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge) {
            // build parameter map (from parameters of second to parameters of first)
            var map = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);

            // replace parameters in the second lambda expression with parameters from the first
            var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);

            // apply composition of lambda expression bodies to parameters from the first expression 
            return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second) {
            return first.Compose(second, Expression.And);
        }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second) {
            return first.Compose(second, Expression.Or);
        }
    }

И последний класс я добавил, был PredicateBuilder:

public static class PredicateBuilder {
    public static Expression<Func<T, bool>> True<T>() { return f => true; }
    public static Expression<Func<T, bool>> False<T>() { return f => false; }

}

Это - мой результат... Я смог выполнить этот код и возвратить получающиеся объекты "содержания", которые имеют соответствие объектам "тега" от тегов, которые я искал!

    public static IList<Content> GetAllContentByTags(IList<Tag> tags) {
        IQueryable<Content> contentQuery = ...

        Expression<Func<Content, bool>> predicate = PredicateBuilder.False<Content>();

        foreach (Tag individualTag in tags) {
            Tag tagParameter = individualTag;
            predicate = predicate.Or(p => p.Tags.Any(tag => tag.Name.Equals(tagParameter.Name)));
        }

        IQueryable<Content> resultExpressions = contentQuery.Where(predicate);

        return resultExpressions.ToList();
    }

сообщите мне, нуждается ли кто-либо в помощи с этим тем же самым, если Вы хотели бы, чтобы я отправил Вам файлы за этим или просто нуждались бы в большем количестве информации

18
ответ дан 30 November 2019 в 08:27
поделиться

Подведение его итогов...

contentQuery.Where(
    content => content.Tags.Any(tag => tags.Any(t => t.Name == tag.Name))
);

Так это, что Вы ожидаете?

я немного смущен.

3
ответ дан 30 November 2019 в 08:27
поделиться

Это - то, что просит сам вопрос:

contentQuery.Where(
    content => content.Tags.Any(tag => tag.Name == "blah")
);

я не уверен, что мыслительный процесс должен был получить к коду корреспондента, действительно, и я не совсем уверен точно что его действительно выполнение. Одна вещь, в которой я действительно уверен, состоит в том, что.AsQueryable () вызов является абсолютно ненужным - или.Tags уже является IQueryable, или.AsQueryable () просто собирается фальсифицировать его для Вас - включение дополнительных вызовов, где не должно быть никого.

2
ответ дан 30 November 2019 в 08:27
поделиться

Ошибка связана с переменной 'тегов'. LINQ к Объектам не поддерживает параметр, который является набором значений. Просто вызов тегов. AsQueryable () - как предложено в ответе ealier - не будет работать или потому что поставщик запроса LINQ в оперативной памяти по умолчанию не совместим с LINQ к Объектам (или другие реляционные поставщики).

Как обходное решение, можно вручную создать фильтр с помощью выражения API (см. это сообщение форума ), и примените его следующим образом:

var filter = BuildContainsExpression<Element, string>(e => e.Name, tags.Select(t => t.Name));
var query = source.Where(e => e.NestedValues.Any(filter));
2
ответ дан 30 November 2019 в 08:27
поделиться
tags.Select(testTag => testTag.Name)

то, Где делает переменную тегов, инициализируется от?Что это?

1
ответ дан 30 November 2019 в 08:27
поделиться

ПРИМЕЧАНИЕ: отредактируйте сам вопрос, вместо того, чтобы ответить с ответом - это не предмет обсуждения, и они могут переупорядочить себя в любое время

, Если Вы ищете все Содержание, которое отмечено с любым из ряда тегов:

IEnumerable<Tag> otherTags;
...
var query = from content in contentQuery
            where content.Tags.Intersection(otherTags).Any()
            select content;

похоже, что Вы могли бы использовать LINQ Для SQL, в этом случае могло бы быть лучше, если Вы пишете хранимую процедуру, чтобы сделать этого: использование LINQ, чтобы сделать это не будет, вероятно, работать на SQL Server - вероятно, что это попробует к выпадающему все от contentQuery и выберет весь эти .Tags наборы. Я должен был бы на самом деле настроить сервер для проверки этого, все же.

0
ответ дан 30 November 2019 в 08:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: