관계

2012-08-08 3 views
0

을 설정하지 않고 NOT IN을 구현하는 방법이이 질문에 유사합니다 NHibernate - Implement "NOT IN" query using ICriteria관계

하지만 그건 내 솔루션을 작동하지 않습니다.

class Order 
{ 
    DateTime CreatedDate { get; set;} 
    Person CreatedBy { get; set; } 
} 

과 담당자 : :

class Person 
{ 
    string Name { get; set;} // etc. 
} 

내가 이 날짜 범위 내에서 주문을하지 할 것을 모든 사람을 검색 할

나는 주문을해야합니다. 는 SQL은 다음과 같이 끝날 것 :

SELECT * 
FROM Person 
WHERE Id NOT IN (SELECT PersonId 
       FROM Order 
       WHERE CreatedDate BETWEEN '2012-01-01' and '2012-01-31') 

내가 위의 질문에서 제공하는 솔루션으로 쿼리 할 때 2,100명 이상 (SQL은 많은 매개 변수를 허용하지 않을 것이다)이있는 경우, 그것은 실패합니다.

너무 많은 데이터를 가져 오기 때문에 Orders 컬렉션을 추가 할 수 없습니다 (날짜 범위 만 필요함).

어떻게 NHibernate로 이것을 할 수 있습니까?

+0

HQL 또는 SQL을 사용하지 않는 이유는 무엇입니까? – Rippo

+0

HQL을 사용해도 괜찮 았지만 쿼리를 유지 관리 할 수 ​​있습니다. 내가 이해 한대로, SQL은 당신이 NHibernate를 가진 엔티티에 당신의 질의를 쉽게 매핑하도록하지 않을 것이다. –

답변

3

당신은 하위 쿼리를 사용하여 작업을해야 LINQ 쿼리입니다 서브 쿼리)

+0

위대한 해결책. 도와 줘서 고마워. –

2

When I query with the solution provided in the above question, it fails if there are 2100 people or more (SQL won't allow that many parameters).

나는 당신이 질의로 그것을 보내기 전에 주문 수집을 가진 사람을 구체화한다고 생각합니다. 여기

var peopleWithOrdersInRange = QueryOver.Of<Order>() 
    .WhereRestrictionOn(x => x.CreatedDate).IsBetween(fromDate).And(toDate) 
    .SelectGroup(x => x.CreatedBy.Id); 

var results = Session.QueryOver<Person>() 
    .WithSubquery.WhereProperty(x => x.Id).NotIn(peopleWithOrdersInRange) 
    .List(); 

이이 사람의 ID로 그룹의 추가와 함께 (즉, 정확한 SQL을 생성합니다 ...

var unwantedPersons = 
    from order in session.Query<Order>() 
    where order.CreatedDate >= startDate && 
     order.CreatedDate <= endDate 
    select order.CreatedBy.Id // NOTE: do not add .ToList() or .ToArray() here. 
          // It *should be* IQueryable<Person> 

var personsWitoutOrders = 
    (from person in session.Query<Person>() 
    where !unwantedPersons.Contains(person.Id) 
    select person).ToArray(); 
+0

이것은 IQueryable 에 Contains 메서드가 없다는 것을 제외하고는 훌륭한 솔루션처럼 보입니다. –

+0

확실합니까? Queryable.Contains 메서드 (IQueryable , TSource)] (http://msdn.microsoft.com/en-us/library/bb338641)? – hazzik

+0

나를 용서해주십시오. Resharper는 나를 혼란스럽게 만들었다. 실제 문제는 두 번째 linq 문의 Where 절에 IQueryable 이 필요하다는 것입니다. –