2013-09-26 25 views
0

我會在我的請求中使用.All方法,但似乎它不被支持。 我有一個parameterList,其中包含具有值和名稱(如字典)和其他東西的元素。 參數,包含值和名稱的元素列表。 第一個列表中的所有元素都必須存在於第二個列表中。 我會用請求爲:NHibernate Linq請求。不支持所有方法

linq.Where(u => (u.ParametersList.All(param => 
    (Parameters.Any(p => 
      p.Value== param.Value && p.Name== param.Name))))); 

如果你有使用別的東西比。所有的想法,我聽你的:) 我試圖

!u.ParametersList.Any(param => 
    !(Parameters.Any(p => 
      p.Value== param.Value && p.Name== param.Name))); 

但我想NHibernate的唐「T作出差異

我也試過

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

只給你需要計算參數每包含的元素ID匹配,並與filterparameter匹配指望他們

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

除非我失去了一些東西,在OP請求LINQ的等價物,而不是QueryOver – Jaguar

+0

@Jaguar我不認爲這是必須LINQ的要求。不過,這個想法可以應用於帶有子查詢的linq查詢 – Firo

相關問題