2011-08-04 2 views
1

전달되는 메소드가 vehicleID입니다. 해당 차량을 포함하는 SalesChannels을 모두 가져와야합니다. SalesChannels에는 VehicleID이라는 속성이있는 SalesChannelVehicle의 IEnumerable이 있습니다.Linq - 콜렉션의 항목에 문자열과 일치하는 속성이있는 경우 부모 :

나는 이걸 시도했지만, SalesChannels을 가져 왔고, 내 Vehicle이 있다는 것을 알았습니다!

var queryable = Session.Linq<SalesChannel>(); 
queryable.Where(y => y.SalesChannelVehicle.Any(z => z.VehicleId == vehicleId)); 

아무도 도와 줄 수 있습니까? 나는 NHibernate를 사용하고 있는데,이 문제에 많은 차이가 있다는 것을 의문의 여지가있다.

+0

다른 SalesChannelVehicle 값을 갖도록 'SalesChannel' 인스턴스를 수정하려고합니다. – SLaks

+0

사실, IQueryable 공급자 인 inst를 사용합니다. "IEnumerable Linq"라는 말은 쿼리가 어떻게 구조화되어야하는지에 큰 차이를 만들 수 있습니다. 그러나, 나는 당신의 질문에 그것의 얼굴에 아무 문제도 찾아 낼 수 없다; 하위 쿼리를 사용하여 Exists 절로 변환해야합니다. 하위 쿼리는 아마도 가장 뛰어난 솔루션은 아니지만 적어도 정확한 결과를 반환해야합니다. – KeithS

+0

'nhprof'를 사용하거나 데이터베이스를 직접적으로 프로파일 링하여 "NHibernate to LINQ"번역기가이 특정 쿼리에 대해 올바르게 작동하는지 확인해 보셨습니까? – Marc

답변

1

나는 당신이 무언가에 반환 된 값을 할당해야한다고 생각한다; KeithS 의해

var queryable = Session.Linq<SalesChannel>(); 
var results = queryable.Where(y => y.SalesChannelVehicle.Any(z => z.VehicleId == vehicleId)); 

EDIT :이 상기 OP 차이가 가변 results 이제 식 트리에 어디에() 메소드의 첨가를 포함 된 IQueryable 포함한다는 것이다. queryable에있는 메소드를 호출하기 만하면 queryable의 표현식 트리가 내부에서 업데이트되지 않습니다. 확장 트리를 어딘가에 할당해야합니다. 당신은 어디에서() 조항을 포함 할 queryable을 원한다면, 당신은 단순히 같은 변수에 할당 할 수 있습니다

var queryable = Session.Linq<SalesChannel>(); 
queryable = queryable.Where(y => y.SalesChannelVehicle.Any(z => z.VehicleId == vehicleId)); 

당신은 또한 어디() 메서드 호출 인라인 할 수 있습니다

var queryable = Session.Linq<SalesChannel>().Where(y => y.SalesChannelVehicle.Any(z => z.VehicleId == vehicleId)); 
+0

. 'results'는 여전히 IQueryable이지만 Where() 메서드로 생성 된 추가 식 트리 구조를가집니다. 분명히 트리를 평가하려면 ToList() 또는 유사한 메소드가 필요합니다. – KeithS

+0

저에게 학교 소년 오류의 오른쪽 비트를 주셔서 감사합니다 - queryable = queryable (Where 절)을 잊어 버렸습니다 !!! –

0
var results = 
    from channel in Session.Linq<SalesChannel>() 
    from vehicle in channel.SalesChannelVehicle 
    where vehicle.VehicleId == vehicleId 
    select channel; 

을 (

관련 문제