NHibernate Linq请求。不支持所有方法

时间:2013-09-26 09:54:19

标签: c# linq nhibernate linq-to-sql

我会在我的请求中使用.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))));

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

1 个答案:

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