我会在我的请求中使用.All方法,但似乎不支持。 我有一个parameterList,它包含带有值和名称的元素(如字典)和其他东西。 和参数,具有值和名称的元素列表。 第一个列表中的所有元素必须存在于第二个列表中。 我将使用的请求是:
linq.Where(u => (u.ParametersList.All(param =>
(Parameters.Any(p =>
p.Value== param.Value && p.Name== param.Name)))));
如果您有使用除了.All之外的其他东西,我会听取您的意见:) 我试过了
!u.ParametersList.Any(param =>
!(Parameters.Any(p =>
p.Value== param.Value && p.Name== param.Name)));
但我猜Nhibernate不会产生差异
我也尝试了
List<System.Tuple<String, String>> ParamTuples = Parameters.Select(p => new System.Tuple<String, String>(p.Value, p.Name)).ToList();
所以,ParamTuples我的第二个列表的元素
linq = linq.Where(url => (url.ParametersList.Any(param =>
ParamTuples.Any(p => p.Item1 == param.Value && p.Item2 == param.Name))));
但它既没有奏效。不支持这些方法。
答案 0 :(得分:0)
只是为了给出你需要计算每个包含元素id的参数匹配并将它们与filterparameter count匹配的想法
class Parameter
{
public virtual Entity Parent { get; set; }
public virtual string Name { get; set; }
public virtual string Value { get; set; }
}
ICriteria filter;
foreach(var param in parameterList)
{
var crit = Expression.And(Expression.Eq("Name", param.Name), Expression.Eq("Value", param.Value);
filter = (filter == null) ? crit : Expression.Or(filter, crit);
}
var subquery = QueryOver.Of<Parameter>()
.Where(filter)
.Select(Projections.Group("Parent.Id"));
.Where(Restrictions.Eq(Projections.Count<Parameter>(p => p.Id), parameterList.Count));
var results = QueryOver.Of<Entity>()
.WuithSubquery.WhereProperty(e => e.Id).IsIn(subquery)
.List();
更新:从你的回答中,上面的所有内容都匹配,但你想要的任何内容(在我的脑海中)
var predicate = PredicateBuilder.False<Parameter>();
foreach (var param in Parameters)
{
predicate = predicate.Or(p => p.Name == param.Name && p.Value == param.Value);
}
// building (u => u.ParametersList.Any(predicate))
var u = Expression.Parameter(typeof(User), "u");
var parametersproperty = Expression.Property(u, "ParametersList");
var anyCall = Expression.Call(parametersproperty, typeof(Queryable).Getmethod("Any"), predicate);
var lambda = Expression.Lambda<User, bool>(u, anyCall);
linq = linq.Where(lambda);