RavenDB: метод не поддерживается: все

1

Я получаю исключение: Method not supported: All в последней строке, ниже:

private static Expression<Func<InstallationSummary, bool>> GetWhereClause(ApplicationServer appServer, ApplicationWithOverrideVariableGroup appWithGroup)
{
    // If we're getting matches that include CustomVariableGroups (CVGs), then the number of CVGs and the IDs must match.
    return summary => summary.ApplicationServerId == appServer.Id &&
                    summary.ApplicationWithOverrideVariableGroup.ApplicationId == appWithGroup.Application.Id &&
                    summary.ApplicationWithOverrideVariableGroup != null &&
                    summary.ApplicationWithOverrideVariableGroup.CustomVariableGroupIds != null &&
                    summary.ApplicationWithOverrideVariableGroup.CustomVariableGroupIds.Count == appWithGroup.CustomVariableGroupIds.Count &&
                    summary.ApplicationWithOverrideVariableGroup.CustomVariableGroupIds.All(appWithGroup.CustomVariableGroupIds.Contains);
}

Есть ли другой вариант использования вместо All(), или мне нужно вернуть результаты и пропустить их в памяти?

public class ApplicationWithOverrideVariableGroup : EntityBase
{
    // More code here
    public List<string> CustomVariableGroupIds { get; set; }
    // More code here
}
  • 1
    Покажите свой класс InstallationSummary чтобы мы могли видеть, что такое CustomVariableGroupIds .
  • 0
    Я добавил это к моему вопросу.
Показать ещё 3 комментария
Теги:
ravendb

4 ответа

1
Лучший ответ

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

Для этого в большинстве случаев вы просто добавляете .AsEnumerable() в свой объект IQueyable. Поскольку методы расширения определяются статически против определенного типа, это означает, что вы будете использовать методы расширения Enumerable, все из которых используют foreach, и, следовательно, запрос оценивается в памяти.

В этом случае может потребоваться некоторая реструктуризация, так как вы возвращаете предложение where - такая реализация должна будет приложить это поведение к построению всего запроса.

  • 0
    Я должен был пойти с подходом в памяти, потому что RavenDB не будет работать с All() или отрицательным Any() . Благодарю.
0

В Raven.Client 3.0 существует метод расширения ContainsAll который, похоже, является тем, что вы ищете.

namespace Raven.Client.Linq
{
    public static class RavenQueryableExtensions
    {
        // Summary:
        //     Implementation of the Contains ALL operatior
        public static bool ContainsAll<T>(this IEnumerable<T> list, IEnumerable<T> items);
    }
}

Exemple:

string[] parts
var query = session.Query<Foo>()
    .Where(s => s.Keywords.ContainsAll(parts));
return query.ToList();
  • 0
    Спасибо за ответ. Надеюсь, это кому-нибудь поможет. Я не в состоянии попробовать это сейчас.
0

Вы можете перевести все, чтобы не было:

     summary.ApplicationWithOverrideVariableGroup.CustomVariableGroupIds.All(appWithGroup.CustomVariableGroupIds.Contains);

в

     !summary.ApplicationWithOverrideVariableGroup.CustomVariableGroupIds.Any(x => !appWithGroup.CustomVariableGroupIds.Contains(x));
  • 1
    «Все» - это не то же самое, что «не любой», если только вы не отрицаете внутреннее выражение. Пример: «Ни одно яблоко не синее» не означает «все яблоки синие», но «ни одно яблоко не является цветом, отличным от синего».
  • 0
    Хотя это и не очень интуитивно понятно (из-за множества!), По крайней мере, это всего лишь одна строка кода. Дай мне посмотреть, смогу ли я заставить это работать ...
Показать ещё 2 комментария
0

Одна из проблем, которые я вижу, заключается в том, что вы не используете правильную перегрузку .All.

То есть вы используете appWithGroup.CustomVariableGroupIds.Contains который является группой методов, и как таковой может быть преобразован в делетете тип Func<..., bool>, но не в Expression<Func<..., bool>> что требуется Queryable.All. Из-за этого на самом деле вы используете Enumerable.All, который не может поддерживаться поставщиком запросов LINQ, который хочет перевести выражение запроса.

Однако вместо этого вы можете написать предложение All как выражение лямбда, а затем вызывается правильная перегрузка:

summary.ApplicationWithOverrideVariableGroup.CustomVariableGroupIds.All(cvg => appWithGroup.CustomVariableGroupIds.Contains(cvg));
  • 0
    Я попробовал это, и я все еще получаю Method not supported: All . Возможно, RavenDB просто пока не поддерживает это.
  • 0
    Я также понимаю, что мое объяснение немного неверно - то есть потому, что CustomVariableGroupIds , вероятно, не является IQueryable , Queryable.All не может использоваться.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню