RavenDB:不支持的方法:全部

时间:2014-12-17 14:46:37

标签: c# ravendb

我在最后一行收到例外: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
}

4 个答案:

答案 0 :(得分:1)

一个选项(尽管可能效率低下)是您始终可以将查询拉入内存然后执行.All(或任何其他Linq方法),因为记录已经加载到应用程序空间中。

要在大多数情况下执行此操作,只需在IQueyable对象上添加.AsEnumerable()即可。因为扩展方法是针对特定类型静态定义的,这意味着您将使用Enumerable扩展方法,所有这些方法都使用foreach,因此查询将在内存中进行评估。

在这种情况下,可能需要进行一些重组,因为您返回了一个where子句 - 这样的实现必须将此行为附加到整个查询的构建中。

答案 1 :(得分:0)

您可以将所有内容翻译为不是:

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

     !summary.ApplicationWithOverrideVariableGroup.CustomVariableGroupIds.Any(x => !appWithGroup.CustomVariableGroupIds.Contains(x));

答案 2 :(得分:0)

我看到的一个问题是您没有使用.All的正确重载。

也就是说,您使用的是appWithGroup.CustomVariableGroupIds.Contains方法组,因此可以转换为委托类型Func<..., bool>,但不能转换为{Expression<Func<..., bool>>所需的All 3}}。因此,您实际上使用的是Queryable.All,而想要翻译查询表达式的LINQ查询提供程序不支持这种情况。

但是,您可以将summary.ApplicationWithOverrideVariableGroup.CustomVariableGroupIds.All(cvg => appWithGroup.CustomVariableGroupIds.Contains(cvg)); 子句写为lambda表达式,然后调用正确的重载:

{{1}}

答案 3 :(得分: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);
    }
}

例如:

string[] parts
var query = session.Query<Foo>()
    .Where(s => s.Keywords.ContainsAll(parts));
return query.ToList();