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