2013-09-26 1 views
0

요청시 .All 메소드를 사용 하겠지만, 지원되지 않습니다. 나는 값과 이름 (사전과 같은)을 가진 요소와 다른 것들을 포함하는 parameterList를 가지고있다. 및 매개 변수, 값 및 이름이있는 요소 목록입니다. 첫 번째 목록의 모든 요소는 두 번째 요소에 있어야합니다. 내가 사용하는 것이 요청은 다음과 같습니다 당신이 .ALL보다는 다른 사용 무언가에 대한 아이디어가있는 경우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

당신이

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

업데이트를 계산 매개 변수가 요소 ID를 포함하는 당 일치 세고 filterparameter로 일치해야합니다 아이디어를 제공합니다 : 당신의 대답에서와 같은 위의 일치 모든하지만 당신은 어떤을 원한다 내가 뭔가를 누락하지 않는 한

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

(내 머리 위로 떨어져), 영업 이익은 Linq에 해당하는 아닌 QueryOver – Jaguar

+0

@Jaguar 내가 LINQ이어야합니다 요구 사항을 볼 수 없습니다를 요청합니다. 그럼에도 불구하고이 아이디어는 하위 쿼리가있는 linq 쿼리에 적용될 수 있습니다 – Firo

관련 문제