0

我会在我的请求中使用 .All 方法,但似乎不受支持。我有一个参数列表,其中包含具有值和名称的元素(如字典)和其他内容。和参数,具有值和名称的元素列表。我在第一个列表中的所有元素都必须存在于第二个列表中。我会使用的请求是:

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))));

但它也没有奏效。不支持这些方法。

4

1 回答 1

0

只是为了给出你需要计算每个包含元素 id 的参数匹配并将它们与过滤器参数计数匹配的想法

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);
于 2013-09-27T08:16:43.197 回答